我有一種情況,我有一個類在其泛型類型參數中接受某個對象類型的實例。佈局是這樣的:在不知道類型的情況下返回泛型
public abstract BaseClass { ... }
public DiamondClass : BaseClass { ... }
public SilverClass : BaseClass { ... }
public Handler<T> where T : BaseClass { ... }
我想能夠創造返回的Handler<DiamondClass>
或Handler<BaseClass>
的實例,不需要在輸入定義類型的方法。我試着沿着這些路線的東西:
public Handler<BaseClass> GetHandler(HandlerType type)
{
switch(type)
{
case HandlerType.Diamond: return new Handler<DiamondClass>();
case HandlerType.Silver: return new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
但是,這是行不通的,因爲很明顯Handler<DiamondClass>
不會隱式轉換爲Handler<BaseClass>
。我可以像這樣指定它:
public Handler<T> GetHandler<T>(HandlerType type) where T : BaseClass
{
switch(type)
{
case HandlerType.Diamond: return (Handler<T>)new Handler<DiamondClass>();
case HandlerType.Silver: return (Handler<T>)new Handler<SilverClass>();
default: throw new InvalidOperationException("...");
}
}
但現在我需要調用GetHandler<DiamondClass>
或GetHandler<BaseClass>
。而且這種方法失去了讓方法返回基於枚舉的正確處理程序的目的,而不知道類型。我希望我可以定義一個Type
對象,並通過它,因爲這樣的:
Type objType = typeof(DiamondClass);
var handler = Handler<objType>();
但很顯然,C#不會讓那種愚蠢的。我已經採取了幾種不同的方式,我想認爲有辦法做到這一點,但我很難過。
(我確實是通過返回dynamic
對象得到這個工作,但我想避免,如果可能的話,因爲它失去了任何類型的安全性和智能感知支持。)
var handler = Handler();',我沒有看到你想要解決什麼問題。 –
CaffGeek
如果您必須檢查泛型方法內部的類型,我總會質疑這種方法的有用性。 –
@RobA請記住,爲了解釋的緣故,我簡化了這個例子。部分問題是我希望它屬於用戶控件,並且我無法將THAT定義爲泛型,因爲它會殺死設計器。 – KChaloux