2011-02-27 30 views
6

Tôi đang cố gắng để chuyển đổi một từ điển < động, động> để một tĩnh-gõ một bằng cách kiểm tra các loại khóa và giá trị và tạo ra một từ điển mới các loại thích hợp sử dụng Reflection. Nếu tôi biết các loại khoá và giá trị, tôi có thể làm như sau:Tạo Generics động khi chạy sử dụng Reflection

Type dictType = typeof(Dictionary<,>); 

     newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType })); 

Tuy nhiên, tôi có thể cần phải tạo ra, ví dụ, một từ điển < MyKeyType, động> nếu các giá trị là không phải tất cả cùng loại và tôi không thể tìm ra cách chỉ định loại động, kể từ

typeof(dynamic) 

không thể thực hiện được.

Tôi làm cách nào để thực hiện việc này và/hoặc có cách nào đơn giản hơn để hoàn thành những gì tôi đang cố gắng làm?

+0

Điều đó sang một bên, cụm từ usecase là gì? tạo các từ điển thông qua sự phản chiếu và lấp đầy chúng bằng dữ liệu phải chậm hơn chi phí hoạt động của việc sử dụng động? –

Trả lời

2
Dictionary<MyType, Object> 

Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>)); 

này thực sự tạo ra một Dictionary<Object, Object>

Việc sử dụng duy nhất tôi có thể nhìn thấy từ việc sử dụng năng động thay vì đối tượng được trong suốt đang gõ bạn có thể sử dụng dic [ "một số"]. MyDynProperty .... nhưng nếu bạn tạo đối tượng của bạn với Activator nó sẽ trả về Object vì vậy không sử dụng trong việc gõ mã ...

4

Trình biên dịch C# phát ra System.Object làm kiểu cho "động". "động" là một cấu trúc ngôn ngữ cụ thể và không có loại tương ứng trong cơ sở hạ tầng ngôn ngữ chung. Như vậy, bạn sẽ không thể sử dụng phản chiếu để tạo "động" cũng như không sử dụng "động" làm thông số loại chung.

Từ điển < động, động > thực sự là từ điển < đối tượng, đối tượng >. Những gì "động" có nghĩa là trình biên dịch chỉ đơn giản là kết thúc muộn bất kỳ truy cập thành viên cho đối tượng bằng cách sử dụng phản ánh (việc thực hiện trong đó nằm trong Microsoft.CSharp lắp ráp trong trường hợp bạn đang tò mò).

Một lưu ý phụ, trình biên dịch cũng sẽ phát ra một thuộc tính, DynamicAttribute, trên các trường, tham số, v.v ... "động"; cho phép mọi người tiêu thụ siêu dữ liệu của assembly để phân biệt giữa System.Object và "dynamic". Đây là cách IntelliSense hiển thị tham số của phương thức là động từ tham chiếu assembly, ví dụ.

+2

Là người đã viết bộ phân tích cú pháp chữ ký siêu dữ liệu được gửi trong VS 2010, hãy để tôi cho bạn biết rằng việc xử lý đúng DynamicAttribute là một nỗi đau thực sự :) –

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