如何将字符串转换为类(泛型)

本文关键字:泛型 转换 字符串 | 更新日期: 2023-09-27 17:49:47

可能重复:
字符串值的泛型类型

给定一个场景,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: Transport0创建一个实例。

否,不使用泛型,因为需要在编译时解析泛型参数。

但是,您当然可以将类型作为参数中的字符串传递,并让方法返回"dynamic"。

var aCar = Get("Car") as Car;
public dynamic Get(string type)
{
  return Activator.CreateInstance(Type.GetType(type));
}