2010-02-04 36 views
6

Tôi đang cố tạo một danh sách chung các đối tượng sử dụng sự phản chiếu. Mã dưới đây ném một lỗi Không thể tạo một thể hiện của một giao diện.. Tôi có thể thay đổi IList thành List và nó hoạt động tốt, nhưng tôi đã tự hỏi liệu có cách nào để làm việc này với một IList không.Tạo một cá thể IList chung bằng cách sử dụng sự phản chiếu

var name = typeof (IList<T>).AssemblyQualifiedName; 

    Type type = Type.GetType(name); 

    var list = Activator.CreateInstance(type); 
+0

typeof (IList ) trả về cùng loại với biểu thức trong dòng thứ hai (Type.GetType (name);) nói cách khác chỉ cần làm var type = typeof (sometype) khi bạn cần đối tượng System.Type cho điều đó cụ thể loại –

Trả lời

7

bạn sẽ phải instatiate một lớp bê tông vì vậy nếu bạn làm

var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName); 
var list = (Ilist<T>)Activator.CreateInstance(type); 

bạn sẽ có succesfull (miễn là bạn cung cấp một giá trị hợp lệ cho T tất nhiên).

+0

Không thể bạn chỉ cần làm: var list = (IList ) Activator.CreateInstance (typeof (Danh sách )); ??? –

+0

vâng, bạn có thể, tôi đã đi theo con đường dài để đến gần đoạn OPS –

6

Activator.CreateInstance phương thức gọi hàm tạo mặc định để tạo một thể hiện của loại được truyền làm tham số. Kiểu này không phải là trừu tượng và không phải là giao diện và có một hàm tạo mặc định để hàm này thành công.

2

Không, điều đó là không thể. Thông báo lỗi rõ ràng. Bạn không thể tạo một thể hiện của một giao diện.

Làm cách nào để biết lớp học cụ thể mà bạn muốn một phiên bản? Thông thường, nhiều lớp triển khai cùng một giao diện. Nên nó chỉ chọn một ngẫu nhiên? ;-)

Điều này không có gì liên quan đến sự phản chiếu, vì bạn sẽ không thể 'khởi tạo' một giao diện bình thường. Chỉ gán các đối tượng thực hiện giao diện và sau đó truyền tham chiếu giao diện xung quanh.

9

Không, bạn không thể tạo phiên bản giao diện.

Làm thế nào để .NET (hoặc đúng hơn là phương thức Activator.CreateInstance) quyết định triển khai giao diện nào mà giao diện đó sẽ khởi tạo?

Bạn không thể làm:

IList<int> l = new IList<int>(); 

một trong hai, có thể bạn? Bạn không thể khởi tạo một giao diện vì giao diện là một định nghĩa hay một hợp đồng mô tả chức năng nào mà một loại sẽ triển khai.

3

Tôi không nghĩ rằng bạn có thể làm việc này, bởi vì bạn không biết bạn cần tạo loại đối tượng nào.

Bạn sẽ gặp vấn đề tương tự với lớp trừu tượng.

2

Rõ ràng bạn không thể instanciate một đối tượng thuộc loại IList<T> trực tiếp vì nó là một loại giao diện.

Bạn nên thử instanciating một List<T> và sau đó có thể trả lại là IList<T>.

2
IList<T> Create<T>() 
{ 
    Type baseListType = typeof(List<>); 
    Type listType = baseListType.MakeGenericType(typeof(T)); 
    return Activator.CreateInstance(listType) as IList<T>; 
} 
+0

Đoạn mã của bạn bị lỗi. typeof (int) phải là typeof (T). Bạn nên cố gắng biên dịch và chạy nó. Tôi đã không nhưng sau đó một lần nữa tôi không cần phải nói nó là sai. Sửa chữa nó và tôi sửa phiếu bầu. ;-) –

+0

bạn nói đúng! đã sửa. –

0

Vâng, bạn CÓ THỂ thiết lập giao diện trong C#. Nhưng chỉ khi bạn thực sự nói với nó làm thế nào để làm như vậy.

Nhìn vào http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.coclassattribute.aspxhttp://blogs.msdn.com/brada/archive/2004/10/10/240523.aspx

Trong trường hợp của bạn tuy nhiên, có vẻ như bạn đã hiểu lầm như thế nào giao diện làm việc.

Chỉ cần tạo danh sách và sau đó trả về số <T> và mã gọi điện của bạn sẽ không quan tâm rằng bạn đang thực sự sử dụng Danh sách <T>.

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