【问题标题】:Create a class from string name, which can be used as T从字符串名称创建一个类,可以用作 T
【发布时间】:2018-07-29 19:45:27
【问题描述】:

如果我创建一个具有字符串名称的类的实例,例如

    public static object GetInstance(string strFullyQualifiedName) {
        Type type = Type.GetType(strFullyQualifiedName);
        if (type != null)
            return Activator.CreateInstance(type);
     }

返回一个对象:

            object myClass = GetInstance("MyClassName");

然后我怎样才能将此对象“myClass”作为 T 传递给方法?

        public static List<T> CreateListAndAddEmpty<T>() where T : new() {
        List<T> list = new List<T>();
        list.Add(new T());
        return list;
    }

var myList = CreateListAndAddEmpty<myClass>();

它不接受 myClass?

'myClass' 是一个变量,但用作类型

任何想法如何从字符串名称创建一个可以用作 T 的类?

谢谢,

【问题讨论】:

  • 泛型在编译时需要有类型。
  • 你必须使用反射来调用方法:stackoverflow.com/questions/232535/…
  • 每次我看到一个涉及将string 转换为特定类型的问题时,它几乎总是一个 XY 问题,或者应该以不同的方式完成。也许如果你解释一下你为什么这样做,我们可以想出一个更好的主意?

标签: c#


【解决方案1】:

泛型类型参数需要类型的名称,而不是类型的实例。您需要&lt;MyClassName&gt;,它只允许您添加已转换为MyClassName 的实例。

如果您在编译时知道类型的名称(如果您可以在源代码中键入名称),则可以使用泛型类型约束,但您不应该使用反射在第一名。如果您想使用new T(),那么您不需要使用Activator.CreateInstance 来创建实例,因为new 会为您完成。

很少需要直接使用反射。在我工作的地方,它只是被彻底禁止了。

如果您在编译时不知道类型(例如,如果用户在运行时输入类型的名称),则不能使用泛型类型约束。您可以使用非泛型 ArrayListList&lt;object&gt;,但您必须尝试将集合中的项目转换为您在使用它们时所期望的类型。

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多