2012-01-01 33 views
7

Tôi đang cố gắng sắp xếp một danh sách các hậu duệ. Đây là những gì tôi có bây giờ, hoạt động tốt:Xml Serialize List of 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; } 
} 

Điều này làm việc tốt và tôi có thể tuần tự hóa cả hai Animal s. Tôi tự hỏi Nếu có thể tạo ra một lớp học Attribute nơi tôi có thể vượt qua danh sách các loài động vật (trường hợp), và sẽ tạo cho tôi các thuộc tính của XmlArrayItem.

Nói chung, tôi đang tìm cách tránh việc chỉ định hậu duệ của Animal mỗi lần tôi tạo một hình mới. Tôi muốn tất cả các hậu duệ của Animal được sắp xếp theo thứ tự, bất kể loại của chúng.

Trả lời

4

Bạn có thể có được một danh sách các loại có nguồn gốc trong một hội đồng như vậy:

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

Có lẽ bạn lướt qua một vòng lặp foreach vào phương pháp GetAllTypesDerivedFrom trên, và sau đó có thể phù hợp với nó vào một giải pháp tương tự như MSDN ví dụ cho XmlArrayItems.

LƯU Ý: Nếu bạn cần để có được tất cả các loại có nguồn gốc cho một giao diện, bạn sẽ cần phải sử dụng thay vì như sau (có thể làm việc với cả hai giao diện và các lớp học):

return types.Where(type.IsAssignableFrom).Where(t => t != type); 
Các vấn đề liên quan