可能重复:
字符串值的泛型类型
给定一个场景,CCD_ 1,CCD_ 2,Interface Transport
,Get(): Generics Method
有可能做这样的事吗?
Transport t= Get<"Car">(string color);
public T Get<T>(string color)
{
return new T(color);
}
p/S:不管返回类型如何,都有理由动态地将其分配为字符串。
如果您想让Get
与字符串一起工作,您有两个选项:添加一个以Type为参数的非泛型Get
,类似于:
public object Get(Type t)
;
这样您就可以将创建的类型传递为字符串。第二种选择可能是反射:
MethodInfo method = typeof(YourType).GetMethod("Get");
MethodInfo generic = method.MakeGenericMethod(myType);
然后您可以调用泛型,就好像它对类型myType关闭一样。
如果我可以建议使用哪种方法,并且可以重构Get
方法,我建议添加该方法的非通用版本。如果您真的不能修改库代码,那么反射版本就会起作用。使用反射的缺点是性能,正如你可能猜测的那样:你可以决定是否可以继续使用它。
编辑
当然,如果您的方法真的只是创建最终对象,我的讨论不适用:
在这种情况下,activator通过传递完整的类型名称发挥魅力:
Activator.CreateInstance(Type.GetType("yourtypename"));
通常,您可以仅基于简单的名称(Car、Bus等(创建类型,因为如果类型不是ExecutingAssembly,则需要完全限定命名空间和assebly。在这种情况下,您必须使用一些约定/配置来简化代码的可读性。
添加
如果你也需要传递参数,我认为你可以尝试开始使用一个简单的IoC(我不会特别推荐一个,选择一个你喜欢的广泛使用的(,它可以为你解决所有这些问题。
如果你不知道编译类型的类名,你就不能使用泛型。不过,您可以使用Activator.CreateInstance
:
object obj = Activator.CreateInstance(Type.GetType(assemblyQualifiedTypeName));
这假设您正在创建的类型具有默认构造函数。
使用反射从类型名称中获取对类型的引用,然后使用Class Car: Transport
0创建一个实例。
否,不使用泛型,因为需要在编译时解析泛型参数。
但是,您当然可以将类型作为参数中的字符串传递,并让方法返回"dynamic"。
var aCar = Get("Car") as Car;
public dynamic Get(string type)
{
return Activator.CreateInstance(Type.GetType(type));
}