簡體   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