【问题标题】:How to convert a string to Class (Generics) [duplicate]如何将字符串转换为类(泛型)[重复]
【发布时间】:2012-12-14 14:04:49
【问题描述】:

可能重复:
Generic type from string value

给定一个场景, Class Car: Transport, Class Bus: Transport, Interface Transport,
Get(): Generics Method

有可能做这样的事情吗?

Transport t= Get<"Car">(string color);

public T Get<T>(string color)
{
  return new T(color);
}

P/S:有理由将其动态分配为字符串,而不管返回类型如何。

【问题讨论】:

  • 不是你建议的方式。在您的情况下,“Car”、“Bus”、“Bike”将始终是一种字符串。您可以打开字符串,创建并返回适当的对象。
  • 你不想那样做,检查你的设计。
  • 看到了,没有回答我的问题:)
  • (Transport)Activator.CreateInstance(Type.GetType("...."))
  • @Roylee 我知道这不能回答你的问题,所以我只是把它作为评论,但我只是想指出,为了让该代码能够编译,你需要Get&lt;T&gt;(string) 方法中泛型类型参数 Twhere T : new() 约束。

标签: c# generics reflection


【解决方案1】:

如果您想让Get 与字符串一起使用,您有两种选择: 添加一个以 Type 作为参数的非通用 Get,类似于:

public object Get(Type t);

因此您可以传递从字符串创建的类型。 第二种选择可能是反射:

MethodInfo method = typeof(YourType).GetMethod("Get");
MethodInfo generic = method.MakeGenericMethod(myType);

然后您可以调用泛型,就好像它已关闭类型 myType。

如果我可以建议使用哪一个,并且如果您可以重构 Get 方法,我会建议添加该方法的非通用版本。如果您确实无法修改库代码,则反射版本有效。正如您可能猜到的那样,使用反射的缺点是性能:您可以决定是否可以继续使用它。

编辑

当然,如果您的方法真的只是创建最终对象,我的讨论不适用

在这种情况下,激活器通过传递完整的类型名称来发挥魅力:

Activator.CreateInstance(Type.GetType("yourtypename"));

您通常可以仅基于简单名称(Car、Bus 等)创建类型,因为如果类型不是 ExecutingAssembly,您需要使用命名空间和组件来完全限定。在这种情况下,您必须使用一些约定/配置来简化代码的可读性。

添加

如果你也需要传参数,我想你可以尝试使用一个简单的IoC(我不特别推荐,选择一个你喜欢的广泛使用的)可以解决所有这些问题给你的问题。

【讨论】:

    【解决方案2】:

    如果您在编译类型时不知道类的名称,您将无法使用泛型。你可以使用Activator.CreateInstance

    object obj = Activator.CreateInstance(Type.GetType(assemblyQualifiedTypeName));
    

    这假定您正在创建的类型具有默认构造函数。

    【讨论】:

      【解决方案3】:

      使用反射从类型名称中获取对该类型的引用,然后使用Activator.CreateInstance 来创建一个实例。

      【讨论】:

        【解决方案4】:

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

        但是,您当然可以将您的类型作为字符串传递给参数,并让您的方法返回“动态”。

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

        【讨论】:

          猜你喜欢
          • 2019-09-10
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          • 2021-07-21
          • 1970-01-01
          相关资源
          最近更新 更多