簡體   English   中英

給定另一個對象的類型,通過反射來構造泛型

[英]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文檔,以獲取有關此主題的詳細說明:

https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/how-to-examine-and-instantiate-generic-types-with-reflection

UDPATE:

您也可以通過以下方式獲取通用類型參數

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM