从字符串名称创建一个类,可以用作T

时间:2018-07-29 11:24:56

标签: c#

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

    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的类吗?

谢谢

1 个答案:

答案 0 :(得分:0)

通用类型参数需要类型的名称,而不是类型的实例。您将需要<MyClassName>,并且只允许您将投射的实例添加到MyClassName

如果在编译时知道类型的名称(如果可以在源代码中键入名称),则可以使用泛型类型约束,但是您不应该在目录中使用反射来创建实例。第一名。如果您想使用new T(),则无需使用Activator.CreateInstance来创建实例,因为new会为您执行此操作。

很少需要直接使用反射。我在哪里工作,就被彻底禁止了。

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