簡體   English   中英

C#:是否可以為類型約束轉換泛型類型?

[英]C#: Is it possible to cast a generic type for a type constraint?

我正在創建一個工廠方法,該方法根據方法調用中的泛型類型確定要返回的對象

public IDbStrategy<T> GetDefaultStrategy<T>()
{
    return typeof(T).IsAssignableFrom(typeof(DbModel))
        ? new DefaultModelDbStrategy<T>()
        : new DefaultDbStrategy<T>();
}

DefaultModelDbStrategy作為where T : DbModel的類型約束,但DefaultDbStrategy沒有。 嘗試使用T作為DefaultModelDbStrategy的泛型類型時出現編譯器錯誤,因為編譯器不知道TDbModel 有沒有辦法確保我的編譯器傳入的泛型參數確實從DbModel派生,如上面的反射語句斷言?

謝謝

不是沒有反思。 因為T是在編譯時靜態解析的,編譯器需要實例化類型DefaultModelDbStrategy<object> (如果 T 是object ),但這是一個非法類型。 方法中使用的類型需要在方法被 JIT 時解析,而不僅僅是在執行特定行時。

不過有一個使用反射的解決方法:你可以做

Activator.CreateInstance(typeof(DefaultModelDbStrategy<>).MakeGenericType(typeof(T));

這將使用給定的 T 創建一個 DefaultModelDbStrategy 實例。如果 T 不滿足約束,它將拋出運行時錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM