What's the best way to instantiate a generic from its name?

落爺英雄遲暮 提交于 2020-01-11 10:11:15

问题


Assuming I have only the class name of a generic as a string in the form of "MyCustomGenericCollection(of MyCustomObjectClass)" and don't know the assembly it comes from, what is the easiest way to create an instance of that object?

If it helps, I know that the class implements IMyCustomInterface and is from an assembly loaded into the current AppDomain.

Markus Olsson gave an excellent example here, but I don't see how to apply it to generics.


回答1:


Once you parse it up, use Type.GetType(string) to get a reference to the types involved, then use Type.MakeGenericType(Type[]) to construct the specific generic type you need. Then, use Type.GetConstructor(Type[]) to get a reference to a constructor for the specific generic type, and finally call ConstructorInfo.Invoke to get an instance of the object.

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);



回答2:


The MSDN article How to: Examine and Instantiate Generic Types with Reflection describes how you can use Reflection to create an instance of a generic Type. Using that in conjunction with Marksus's sample should hopefully get you started.




回答3:


If you don't mind translating to VB.NET, something like this should work

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;
}


来源:https://stackoverflow.com/questions/130208/whats-the-best-way-to-instantiate-a-generic-from-its-name

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!