我有下面的類層次結構:上溯造型到一個泛型類型
class A {
/// stuff
}
class B : A {
/// stuff
}
class C<T> : B {
/// stuff
}
然後某處完全不同的,我有以下三種方法:現在
public void foo(A a) {
}
// overload 1
public void bar(B b) {
}
// overload 2
public void bar<T>(C<T> ct) {
}
,不管出於什麼原因,我需要調用如果A實際上是B類型的,我需要調用重載1,如果A實際上是C類型(無論T是什麼),我需要調用超載2.爲了完整性,如果A不是B或C,則什麼都不做。
現在,我使用的是Type類的IsAssignableFrom方法來決定是否上轉換到B是可能的:
public void foo(A a) {
if (typeof(B).IsAssignableFrom(a)) {
bar((B)a);
}
}
但是這需要在C變種爲好。所以問題是,我該如何執行這個upcast?反射?動力學?我們使用.NET 4,所以在C#5中引入的任何東西都無法使用。
This Works!謝謝。一個問題是你必須有一個對Microsoft.CSharp程序集的引用。 – syazdani
考慮到「如果A既不是B也不是C,什麼都不做」的說明,這個動態解決方案將不會說明這個問題,對嗎? –
它不但與我已有的IsAssignableFrom結合使用,而且還可以工作。 – syazdani