我正在創建一個工廠方法,該方法根據方法呼叫中的泛型型別確定要回傳的物件
public IDbStrategy<T> GetDefaultStrategy<T>()
{
return typeof(T).IsAssignableFrom(typeof(DbModel))
? new DefaultModelDbStrategy<T>()
: new DefaultDbStrategy<T>();
}
在DefaultModelDbStrategy作為一種約束where T : DbModel,但DefaultDbStrategy沒有。嘗試T用作泛型型別時出現編譯器錯誤,DefaultModelDbStrategy因為編譯器不知道這T是一個DbModel. 有沒有辦法確保我的編譯器傳入的泛型引數確實源自DbModel上面的反射陳述句斷言?
謝謝
uj5u.com熱心網友回復:
不是沒有反思。因為T是在編譯時靜態決議的,編譯器需要實體化型別DefaultModelDbStrategy<object>(如果 T 是object),但這是一個非法型別。方法中使用的型別需要在方法被 JIT 時決議,而不僅僅是在執行特定行時。
有一個使用反射的解決方法:你可以做
(IDbStrategy<T>)Activator.CreateInstance(typeof(DefaultModelDbStrategy<>).MakeGenericType(typeof(T)));
這將使用給定的 T 創建一個 DefaultModelDbStrategy 實體。如果 T 不滿足約束,它將拋出運行時錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335850.html
標籤:C#
