2017-09-01 78 views
0

假設我有一個基類像下面使用表達式樹訪問具有相同名稱的方法在2個不相關的類

public abstract class BaseHelloWorld<T> where T : BaseEntity 
{ 
    public abstract IEnumerable<T> DoSomething(); 
} 

和另一等

public class BaseEntity 
{ 
    public abstract void DoSomethingInPayload(); 
} 

然後,我有4類,如:

public class Payload1 : BaseEntity 
{ 
    public override void DoSomethingInPayload() 
    { 
     Console.Write("Hello world"); 
    } 
} 

public class Class1 : BaseHelloWorld<Payload1> 
{ 
    public override IEnumerable<Payload1> DoSomething() 
    { 
     return new List<Payload1> { }; 
    } 
} 

public class Payload2 : BaseEntity 
{ 
    public override void DoSomethingInPayload() 
    { 
     Console.Write("Goodbye world"); 
    } 
} 

public class Class2 : BaseHelloWorld<Payload2> 
{ 
    public override IEnumerable<Payload2> DoSomething() 
    { 
     return new List<Payload2>() { }; 
    } 
} 

雖然我在這裏顯示的代碼,假設這些地方我沒有co的第三方庫德,我想擴展它們。我想要做的是能夠創建一個單一的擴展方法,這將允許我這樣稱呼上相似的有效載荷類DoSomethingInPayload()方法來

public static void CallDoSomething<T>(this BaseHelloWorld<T> theClass) where T: BaseEntity 
{ 
    theClass.DoSomethingInPayload(); 
} 

顯然,這將無法工作,所以我開始尋找表達樹木。我的閱讀表明這可能與表達樹有關,但我無法弄清楚。經過幾個小時的嘗試,我無法確定我的理論是否正確。因此,請你告訴我:

A)是否可以用表達式樹做到這一點 B)如果是的話我該怎麼做?

在此先感謝

+3

怎麼樣'的IEnumerable CallDoSomething (這BaseHelloWorld theClass描述) '? –

+0

這是可能的,但爲什麼表達樹(或反射) - 「動態」就是爲此而設計的,例如'return((dynamic)theClass).DoSomething();' –

+0

,因爲你不能使用動態作爲擴展方法的第一個參數 – John

回答

1

你自己的例子是行不通的,因爲T是不同類型的輸入和返回參數。

事實上,作爲@AleksAdreev提到的,你可以簡單地嘗試:

public static IEnumerable<T> CallDoSomething<T>(this BaseHelloWorld<T> theClass) 
{ 
    return theClass.DoSomething(); 
} 

然後可以稱爲如下:

var someClass = new Class2(); 
var someResult = someClass.CallDoSomething(); 
+0

我試圖在我的示例中給出一個可以通過@AleksAdreev解決方案修復的簡單示例。我的真實世界的例子非常複雜,我沒有所有的源代碼,所以這是我試圖展示的。我已經更新了這個問題,以顯示我有 – John

+1

@John的問題爲什麼它不工作?只需添加必要的約束:'where T:BaseEntity' – InBetween

+0

因爲我急於糾正問題,所以我在示例中犯了一個錯誤。我真的很抱歉,我會糾正它:( – John

相關問題