如何在C#中实例化泛型类型对象

本文关键字:实例化 泛型类型 对象 | 更新日期: 2023-09-27 18:10:17

我有这样的类:

public ClassA<T> where T : class{
       ...
}

现在我需要在ClassB:的构造函数中创建一个ClassA的对象

public ClassB{
   public ClassA<?> objA;
   public ClassB(string TypeInfo){
       objA = new ClassA<?>(); // Suppose TypeInfo = 'ClassC', and the '?'
                               // Should be derived from TypeInfo
   }
   ...
}

我不知道用什么来代替"?"对于,因为该类型只能在运行时已知。。。有什么想法吗?

如何在C#中实例化泛型类型对象

最接近于在运行时确定和创建泛型类型(使用表示类型名称的字符串(的方法是这样实例化它。

public class ClassB
{
    public ClassB(string typeInfo)
    {
        var typeOfT = Type.GetType(typeInfo);
        var type = typeof(ClassA<>).MakeGenericType(typeOfT);
        var instance = Activator.CreateInstance(type);
    }
}

除非您将字段标记为动态,否则直接通过公共字段公开这一点是不可行的,因为否则它将需要预先提供通用类型信息。

public dynamic objA;

此外,表示类型的字符串必须足够限定,以便Type.GetType()可以在没有歧义的情况下定位它。例如,SomeNamespace.ClassC而不是ClassC

使用object o = Activator.CreateInstance(constructed);

这来自MSDNhttp://msdn.microsoft.com/en-us/library/system.activator.createinstance.aspx

编辑

我们在扩展方法中使用它,如;

public static object DefaultValue(this Type targetType) { return targetType.IsValueType ? Activator.CreateInstance(targetType) : null; }

让它与泛型一起工作并不是一个很大的扩展

由于objA是ClassB定义的一部分,如果ClassA有类型参数,则ClassB必须有类型参数

public ClassB<T>
{
   public ClassA<T> objA
   ...
}

如果objA的类型在编译时未知,那么它必须是Object类型或非泛型基或接口。没有中间立场。

没有理由对编译时未知的类型使用泛型,因为泛型只用于known类型,这意味着您总是可以用类型替换泛型参数。

在被质疑的情况下,唯一匹配的类型是object类型,它是所有对象类型的基类,编译器总是知道它。

public ClassB{ 
   public ClassA<object> objA; 
   public ClassB(string TypeInfo){ 
       objA = new ClassA<object>();
   } 
   ... 
} 

关于你的问题。。。

使用编译时未知类型的唯一方法是在运行时解析该类型,使ClassB成为泛型,并对泛型类a使用ILGenerator((在运行时实例化该类的构造。

public ClassB<T>{ 
   public ClassA<T> objA; 
   public ClassB(){ 
       objA = new ClassA<T>();
   } 
   ... 
}