2009-03-17 38 views
5

Tôi đang sử dụng LINQ-to-XML để truy vấn một tệp cho danh sách đối tượng. Tất cả chúng đều có cùng một cấu trúc (một số tùy chọn, một danh sách các tham số của độ dài không xác định). Dựa trên tên của họ trong tệp XML, tôi muốn sử dụng các tham số cho những thứ hoàn toàn khác nhau - vì vậy tôi đã tạo các lớp con của đối tượng này.Làm thế nào tôi có thể tự động gọi một hàm tạo trong C#?

Câu hỏi của tôi là - làm cách nào để tôi tự động gọi hàm tạo đúng, mà không làm điều gì đó giống như tuyên bố trường hợp? Hay giải pháp để tạo ra các lớp con khác nhau một cách tao nhã từ XML nằm ở nơi khác?

class Object1 
{ 
    string name; 
    OptionObj opt; 
    List<Param> parameters; 
} 

class sonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something with the parameters 
    } 
} 

class secondSonOfObject : Object1 
{ 
    public void ExecuteSomething() 
    { 
     //do something entirely different with the parameters 
    } 
} 

var query = from x in xmlDoc.Descendants("Object") 
    select new Object 
    { 
     //select the object from the XML 
    } 

Sau bit bit này, tôi có thể sử dụng hàm tạo bản sao để tạo một sonOfObject từ đối tượng truy vấn chung chung hơn. Nhưng làm thế nào để tôi làm điều đó một cách năng động, dựa trên tên của lớp trẻ?

Tôi biết rằng bạn có thể nhận MethodInfo từ một loại và gọi nó ala ...

MethodInfo m = t.GetMethod(someName); 
m.Invoke(yourObj, null); 

Nhưng điều đó có nghĩa là tôi sẽ phải nhanh chóng 9 hoặc 10 của các đối tượng lớp con (và nhận được các loại cho mỗi người trong số họ), và vẫn kết thúc trong một số loại tuyên bố trường hợp.

Có cách nào thanh lịch hơn để gọi các nhà xây dựng lớp trẻ không?

Trả lời

3

Để cho một lớp tham gia vào chương trình này, tôi sẽ đánh dấu nó bằng thuộc tính tùy chỉnh, cung cấp cho nó một "tên XML".

Sau đó, sử dụng phản chiếu để tìm tất cả các số Type được đánh dấu bằng thuộc tính đó và đặt chúng trong một Dictionary<string, Type>. Tại thời điểm này, bạn cần phải quyết định làm thế nào bạn sẽ tìm thấy các hội đồng khác có thể đóng góp các loại cho hệ thống. Một cách tiếp cận đơn giản là tìm các tệp khác có phần mở rộng .DLL trong cùng một thư mục.

Sau đó, bất cứ khi nào bạn có chuỗi từ XML mà bạn muốn sử dụng để tạo ra một thể hiện của các Type tương ứng, chỉ cần nhìn các Type lên trong Dictionary theo tên và gọi Type.GetConstructorConstructorInfo.Invoke.

Lợi thế của việc này là định danh trong XML được tách biệt khỏi bố cục vật lý của mã của bạn - bạn có thể di chuyển các loại xung quanh trong các hội đồng hoặc đổi tên chúng mà không làm mất hiệu lực các tệp XML cũ.

+0

+1 Sau khi đọc lại OP Tôi tin rằng đây thực sự là giải pháp tốt hơn. –

7

Activator.CreateInstance cho phép bạn chuyển tên lớp dưới dạng chuỗi và nó sẽ trả lại cho bạn một phiên bản mới của lớp đó.

Các vấn đề liên quan