2009-03-31 27 views
31

Tôi có một Generic Type Interface và muốn một nhà xây dựng của một đối tượng để có trong Generic Interface.
Giống như:Generic Type in constructor

public Constructor(int blah, IGenericType<T> instance) 
{} 

Tôi muốn các mã tạo đối tượng này để xác định IGenericType (sử dụng Inversion of Control). Tôi đã không nhìn thấy một cách để điều này xảy ra. Bất kỳ đề xuất để thực hiện điều này?

Tôi muốn một người nào đó để tạo ra các đối tượng như:

Constructor varname = new Constructor(1, new GenericType<int>()); 

Trả lời

40

Bạn không thể làm cho nhà xây dựng chung, nhưng bạn có thể sử dụng một phương pháp tĩnh chung thay vì:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance) 

và sau đó làm bất cứ điều gì bạn cần phải sau khi các nhà xây dựng, nếu cần thiết. Một lựa chọn khác trong một số trường hợp có thể là giới thiệu một giao diện không chung chung mà giao diện chung mở rộng.

EDIT: Theo ý kiến ​​...

Nếu bạn muốn lưu các đối số vào đối tượng mới được tạo ra, và bạn muốn làm như vậy một cách mạnh mẽ gõ, sau đó loại phải chung cũng .

Vào thời điểm đó vấn đề xây dựng sẽ biến mất, nhưng bạn thể muốn giữ lại một phương pháp chung tĩnh anyway trong một loại phi generic: để bạn có thể tận dụng lợi thế của kiểu suy luận:

public static class Foo 
{ 
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance) 
    { 
     return new Foo<T>(instance); 
    } 
} 

public class Foo<T> 
{ 
    public Foo(IGenericType<T> instance) 
    { 
     // Whatever 
    } 
} 

... 

IGenericType<string> x = new GenericType<string>(); 
Foo<string> noInference = new Foo<string>(x); 
Foo<string> withInference = Foo.CreateInstance(x); 
+0

tôi sẽ muốn lưu IGenericType như là một thành viên var, để làm điều đó tôi đoán tôi sẽ phải làm cho toàn bộ lớp chung chung không chỉ là phương pháp ...? – CSharpAtl

+0

Có, nếu bạn cần nó được gõ mạnh mẽ như là một biến thành viên, sau đó bạn nên làm cho toàn bộ loại chung và sau đó vấn đề constructor biến mất. –

+0

muốn chạy ý tưởng thiết kế của tôi để bạn xem có điều gì đó tốt hơn về cơ bản để làm hay không. Đừng nghĩ rằng tôi có thể gõ tất cả trong bình luận này. Tôi có thể đăng lên blog của bạn hoặc gửi email cho bạn không? – CSharpAtl

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