2011-12-26 55 views
2

我試圖構造一個接受方法指示的流暢式API。我想實現可以用這個(無效)代碼樣本來描述下:構建一個接受方法組的流暢API方法

public class SampleBuilder 
{ 
    public void Method<T>(Expression<Func<T, Delegate>> func) { } 
    // for the sake of this example this method doesn't have a return value 
} 

public class Sample 
{ 
    public void SomeMethod(int some, int arbitrary, int agruments) { } 
} 

public class SampleConfig 
{ 
    public void Config() 
    { 
     new SampleBuilder().Method<Sample>(x => x.SomeMethod); 
    } 
} 

的問題是編譯器顯然抱怨x.SomeMethod表示方法組。我的API既不能推定實際的實例,也不能推定實際的方法簽名。這是在運行時決定的。

你會如何解決這種情況,以提供一個易於使用的API,讓用戶指定一個方法組?


背景:導致使用量將是這樣的:

config.Transition().From(v1def, v1 => v1.ExitMethod).To(v2def, v2 => v2.EntryMethod); 

To()From()接受意見及其進入/退出方法定義。在上面的具體示例中,v1def表示視圖定義類,而v1表示實際視圖類。在一天結束時,構建新的轉換並將其添加到config中。

回答

1

不幸的是,根本無法將方法組作爲參數傳遞。據我所知,CLR(以及各種語言和它們之間的所有內容)不允許傳遞本質上是無類型委託的東西......並且由於方法重載,具有不同簽名的多個委託的場景是用方法組名稱表示必須考慮。

因爲我不知道你的視圖定義和視圖實例類是如何構造或實現的細節,所以我能做的最好的是建議通過使用attributes來使用AOP。如果它適用於你的架構,我會強烈建議考慮它。你可以使用自定義屬性修飾你的入口和出口方法,並在你的配置類中使用裝飾。

如果您的架構不適合使用AOP進行增強,您唯一剩下的選擇是使用弱寫類型的解決方案,該解決方案在編寫配置時使用字符串,以及在閱讀這些字符串時進行大量反射背部。我知道它看起來不像.NET中的其他流利的API,但這真的很糟糕嗎?

config.Transition().From(v1def, "ExitMethod").To(v2def, "EntryMethod"); 
0

的方法之一是增加

public void SomeMethod() { } 

在Sample類,並改變SampleBuilder.Method簽名

public void Method<T>(Expression<Func<T, Action>> func) { } 

這樣你就可以捕捉到需要的方法的名稱(通過傳遞方法組轉換爲委託實例)並選擇適當的重載。

相關問題