2017-01-02 41 views
6

在我的項目中,我使用以下類:Filter<T>.Checker<U>,它也具有接口IChecker。它看起來像這樣:在C#中的通用類中獲取嵌套通用類的類型

class Filter<T> { 

    public interface IChecker { 
     ... 
    } 

    public class Checker<U> : IChecker { 
     ... 
    } 

    List<IChecker> checkers; 

    ... 

} 

過濾器類濾波器類型T的對象的過濾器使用IChecker列表,以檢查在T級中,U是該領域的在T.

類型不同的領域

在另一個類中的其他方法中,我想創建一個檢查器的實例。在這種方法中,T的類型是Transaction,這在編譯時是已知的。 U的類型僅由Type實例知道。下面的代碼展示瞭如何通常創建一個知道類型的泛型類的實例。

Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

我想借此一點點進一步並執行以下操作:

Type type = typeof(Filter<Transaction>.Checker<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

的部分typeof(Filter<Transaction>.Checker<>)不能編譯。編譯器說:Unexpected use of an unbounded generic name

是否有可能在C#中的泛型類中獲取嵌套的泛型類的類型?

+2

要添加到已發佈的答案 - 它是在[MSDN](HTTPS的文檔中解釋說: //msdn.microsoft.com/en-us/library/system.type.makegenerictype%28v=vs.110%29.aspx)。檢查整個**嵌套類型**部分,尤其是:*「要從嵌套類型的泛型類型定義構造泛型類型,請調用MakeGenericType方法,該數組通過連接所有封閉類型的類型參數數組形成,從最外面的泛型類型開始,並以嵌套類型自身的類型參數數組結束,如果它有自己的類型參數。「* – MarcinJuraszek

回答

3

好泛型要求你指定所有或不泛型的參數。因爲你不知道在編譯時的第二個參數,你必須兩者來作爲參數傳遞給MakeGenericType

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction), objectType); 
object myObject = Activator.CreateInstance(type); 

雖然你知道在編譯時的類型Transaction,你需要通過typeof()指定,但這不應該傷害。

我通過is運算符驗證了類型參數是按預期順序應用的。

4

我認爲你必須在這裏省略了第一個通用參數T,並通過這兩種類型的數組:

Type type = typeof(Filter<>.Checker<>).MakeGenericType(typeof(Transaction),objectType);