[英]Creating dynamic generics at runtime using Reflection
我試圖通過檢查鍵和值的類型並使用Reflection創建適當類型的新Dictionary來將Dictionary < dynamic , dynamic >轉換為靜態類型。 如果我知道鍵和值類型,我可以執行以下操作:
Type dictType = typeof(Dictionary<,>);
newDict = Activator.CreateInstance(dictType.MakeGenericType(new Type[] { keyType, valueType }));
但是,我可能需要創建一個Dictionary < MyKeyType , dynamic >如果值不是所有相同的類型,我無法弄清楚如何指定動態類型,因為
typeof(dynamic)
是不可行的。
我將如何做到這一點,和/或是否有更簡單的方法來完成我想要做的事情?
C#編譯器將System.Object作為“dynamic”的類型發出。 “dynamic”是特定於語言的構造,並且在公共語言基礎結構中沒有對應的類型。 因此,您將無法使用反射創建“動態”,也無法使用“動態”作為泛型類型參數。
字典<dynamic,dynamic>實際上是Dictionary <object,object>。 “動態”對編譯器來說意味着簡單地使用反射來綁定對象的任何成員訪問(其實現位於Microsoft.CSharp程序集中,以防您感到好奇)。
另外,編譯器還會在“動態”的字段,參數等上發出屬性DynamicAttribute; 允許人們使用程序集的元數據來區分System.Object和“dynamic”。 這就是IntelliSense如何將方法的參數顯示為來自裝配參考的動態參數。
Dictionary<MyType, Object>
Activator.CreateInstance(typeof (Dictionary<dynamic, dynamic>));
這實際上創建了一個Dictionary<Object, Object>
我可以從使用動態而不是對象看到的唯一用途是在代碼輸入期間你可以使用dic [“some”]。MyDynProperty ....但是如果用Activator創建對象,它將返回Object,因此在代碼輸入時沒有用。 ..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.