我有这样的课程:
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
}
...
}
我不知道要替换什么'?'因为这种类型只能在运行时知道......有什么想法吗?
答案 0 :(得分:10)
最接近于在运行时确定和创建泛型类型(使用表示类型名称的字符串),就像这样实例化它。
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
。
答案 1 :(得分:0)
使用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; }
使其与泛型一起使用并不是一个巨大的延伸
答案 2 :(得分:0)
由于objA是ClassB定义的一部分,如果ClassA有一个类型参数,ClassB必须有一个类型参数,即
public ClassB<T>
{
public ClassA<T> objA
...
}
如果在编译时不知道objA的类型,则它必须是Object
类型或非通用基类或接口。没有中间立场。
答案 3 :(得分:-1)
没有理由对编译时未知的类型使用泛型,因为泛型仅用于KNOWN类型,这意味着您始终可以用类型替换泛型参数。
质疑情况中唯一匹配的类型是object
类型,它是所有对象类型的基类,并且始终为编译器所知。
public ClassB{
public ClassA<object> objA;
public ClassB(string TypeInfo){
objA = new ClassA<object>();
}
...
}
关于你的问题......
使用在编译时未知的类型的唯一方法是在运行时解析类型,使ClassB通用,并使用ILGenerator()作为泛型类A在运行时实例化该类的构造
public ClassB<T>{
public ClassA<T> objA;
public ClassB(){
objA = new ClassA<T>();
}
...
}