[英]How can I return type T from Func delegate?
我有一個定義如下通用Add方法的類:
public T Add(T item){
在該方法中,我想為該類型動態調用正確的方法,例如,如果我有:
private Foo AddFoo(Foo f){
//do foo adding stuff
}
private Bar AddBar(Bar b){
//do bar adding stuff
}
//等等,還有更多類型
如何獲得我的Add方法來為我的類型調用正確的方法? 似乎我可以在這里使用Func委托,但是我正在努力解決。 非常感謝!
注意:不能為不同類型重載Add,因為該類從接口實現了Add方法(並且不是我要更改的接口)
為什么不重載Add
方法?
public Foo Add(Foo f) { ... }
public Bar Add(Bar f) { ... }
public Baz Add(Baz f) { ... }
public Pony Add(Pony f) { ... }
正確的重載將由編譯器自動選擇。 如果將不是Foo
, Bar
, Baz
或Pony
的對象傳遞給Add
,則編譯器將發出錯誤。 如果您使用泛型並編寫自己的分派,則情況並非如此。
如果使用泛型:
public T Add<T>(T obj) { ... }
然后,編譯器將允許您編寫:
Add(new Widget());
這將導致運行時異常。 不建議使用此解決方案。 您一無所獲,並且失去了類型系統的好處。
關於您的編輯:
無法為不同類型重載Add,因為該類從接口實現Add方法
我建議您修復此界面。 該接口已損壞,應予以修復。 泛型不應該用於創建僅在分派靜態類型系統時執行分派的包羅萬象的方法。 您在此處對泛型的用法與簡單地使用object
作為返回值和參數類型沒有什么不同。
如果無法修復此接口,請選擇其他答案。
使用C#7.1或更高版本,您可以通過模式匹配將其實現為:
public T Add<T>(T item)
{
switch (item)
{
case Foo a: return (T)(object) AddFoo(a);
case Bar b: return (T)(object) AddBar(b);
default: throw new InvalidOperationException(typeof(T) + " is not supported!");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.