[英]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.