什么是实例从它的名字一个通用的最佳方法?(What's the best way to in

2019-07-01 21:06发布

假设我只有一个通用的如“(中MyCustomObjectClass)MyCustomGenericCollection”形式的字符串的类名,也不知道它来自装配,什么是创建一个对象实例的最简单的方法?

如果有帮助,我知道,这个类实现IMyCustomInterface,距离加载到当前的AppDomain的程序集。

马库斯·奥尔森给了一个很好的例子, 在这里 ,但我不明白如何将它应用到仿制药。

Answer 1:

一旦你分析它,使用Type.GetType(字符串) ,以获得所涉及的类型的引用,然后使用Type.MakeGenericType(键入[])来构造所需的特定泛型类型。 然后,使用Type.GetConstructor(键入[])来获得,以用于特定通用类型构造函数的引用,并且最后调用ConstructorInfo.Invoke来获取对象的一个实例。

Type t1 = Type.GetType("MyCustomGenericCollection");
Type t2 = Type.GetType("MyCustomObjectClass");
Type t3 = t1.MakeGenericType(new Type[] { t2 });
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes);
object obj = ci.Invoke(null);


Answer 2:

MSDN文章如何:检查和实例化泛型类型与反思介绍了如何使用反射来创建一个通用类型的实例。 使用与Marksus的样品一起会告诉你如何开始。



Answer 3:

如果你不介意的话翻译成VB.NET,这样的事情应该工作

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
    // find the type of the item
    Type itemType = assembly.GetType("MyCustomObjectClass", false);
    // if we didnt find it, go to the next assembly
    if (itemType == null)
    {
        continue;
    }
    // Now create a generic type for the collection
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);;

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType);
    break;
}


文章来源: What's the best way to instantiate a generic from its name?