繁体   English   中英

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

[英]How to instantiate a generic type object in C#?

我有这样的课:

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
   }
   ...
}

我不知道该替换什么? 因为类型只能在运行时知道...有什么想法吗?

在运行时最可能确定和创建泛型类型(使用代表类型名称的字符串)的实例是这样实例化的。

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);

这来自MSDN http://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>();
   } 
   ... 
} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM