![](/img/trans.png)
[英]Construct an instance of a concrete type of a generic, using reflection at runtime
[英]Construct a generic type through reflection given the type of another object
我將類型傳遞給方法,並基於該類型創建對象。 假設argType
是一個Type
並作為參數傳遞給該方法。
var assembly = AppDomain.CurrentDomain.GetAssemblies().Single(a => a.GetName().Name == "MyAssembly");
var newType = assembly.GetTypes().SingleOrDefault(x => x.FullName == argType.FullName + "Suffix");
var newObject = Activator.CreateInstance(newType);
這對於大多數對象都可以正常工作,但是如果我傳遞帶有泛型子類型的類型(例如MyClass<MyType>
),則會失敗[假設目標是將newObject
設置為MyClassSuffix<MyType>
]。
如何改進上面的代碼,以便也可以創建泛型(以“后綴”結尾)? 我查看了包含諸如'1[[
等子字符串]之類'1[[
此類的FullName
屬性。 在這些字符開始之前,我寧願不進行正則表達式解析以附加“后綴”。 我在想有一種更好的方法。
如果您同時具有兩種類型的實例,即泛型類和泛型類型參數,則可以使用MakeGenericType
方法:
// assuming you have a generic class named Class<>
// taking one generic type parameter
Type generic = typeof(MyClassSuffix<>);
Type typeParameter = typeof(MyClass);
Type genericInstance = generic.MakeGenericType(typeParameter);
接着:
object o = Activator.CreateInstance(genericInstance);
在您的情況下,您將generic
用作newType
,則需要確定需要將哪種類型作為類型參數傳遞,並且該類型應該起作用。
閱讀以下MSDN文檔,以獲取有關此主題的詳細說明:
您也可以通過以下方式獲取通用類型參數
var newType = assembly.GetTypes().SingleOrDefault(x => x.FullName == argType.FullName + "Suffix");
if(newType.IsGenericType)
{
// Get the generic type parameters or type arguments.
Type[] typeParameters = t.GetGenericArguments();
// Construct the type Dictionary<String, Example>.
Type constructed = newType.MakeGenericType(typeParameters);
}
如果您使用的是封閉類型,則可以像普通類一樣實例化它。 請參見以下示例:
public class GenericClass<Int>
{
}
現在我們可以生成它的一個實例,例如:
Type t = typeof(GenericClass<int>);
object o = Activator.CreateInstance(y);
Console.WriteLine(o);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.