2012-01-01 13 views
7

मैं वंशजों की एक सूची क्रमबद्ध करने की कोशिश कर रहा हूं।एक्सएमएल सीरियलज descendants की सूची

class Animal {} 
class Zebra:Animal{} 
class Hippo:Animal{} 

[XmlRootAttribute("Zoo")] 
class Zoo 
{ 
    [XmlArrayItem(typeof(Zebra))] 
    [XmlArrayItem(typeof(Hippo))] 
    public List<Animal> Actions 
    { set; get; } 
} 

यह ठीक काम करता है और मैं दोनों Animal रों को क्रमानुसार कर सकते हैं: यह वही है मैं अब है कि ठीक काम करता है है। मुझे आश्चर्य है कि Attribute कक्षा बनाना संभव है जहां मैं जानवरों (उदाहरण) की सूची पास कर सकता हूं, और मेरे लिए XmlArrayItem एस विशेषताओं का निर्माण करेगा।

आम तौर पर, मैं हर बार एक नया निर्माण करने पर Animal के वंशजों को निर्दिष्ट करने से बचने के लिए एक तरीका ढूंढ रहा हूं। मैं Animal के सभी वंशजों को क्रमबद्ध करने के लिए चाहता हूं, जो भी उनके प्रकार का हो।

उत्तर

4

तुम इतनी तरह एक विधानसभा के भीतर ली गई प्रकार की एक सूची प्राप्त कर सकते हैं:

public IEnumerable<Type> GetAllTypesDerivedFrom(Type type) 
{ 
    var types = Assembly.GetAssembly(type).GetTypes(); 
    return types.Where(t => t.IsSubclassOf(type)); 
} 

शायद आप ऊपर GetAllTypesDerivedFrom विधि पर एक foreach पाश के माध्यम से चक्र, और फिर एक समाधान MSDN के समान में फिट कर सकते हैं XmlArrayItems के लिए उदाहरण।

नोट:

return types.Where(type.IsAssignableFrom).Where(t => t != type); 
: यदि आप एक इंटरफेस के लिए सभी प्रकार के व्युत्पन्न पाने के लिए की जरूरत है, आप के बजाय निम्नलिखित का उपयोग करने के (दोनों अंतरफलक और वर्गों के साथ काम करेगा) की आवश्यकता होगी
संबंधित मुद्दे