2011-12-26 10 views
2

メソッドの指示を受け入れる流暢なスタイルのAPIを構築しようとしています。私は何を達成したいが、この(無効)のコードサンプルでdecribedすることができます。メソッドグループを受け入れる流暢な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を提供するにはどうすればよいですか?


背景:To()From()ビューの定義を受け入れ、それらエントリ/出口方法

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

:得られた使用量がこのようになります。上記特定のサンプルでは、​​v1defはビュー定義クラスを示し、v1は実際のビュークラスを示します。その日の終わりに、新しいの遷移が構築され、configに追加されます。

答えて

1

残念ながら、メソッドグループをパラメータとして渡す方法はありません。私が知っている限り、CLR(さまざまな言語やその間のすべてのもの)は、本質的に型なしの代理人を回避することを禁じています...そしてメソッドのオーバーロードのために、異なる署名を持つ複数の代理人のシナリオメソッドグループ名で表現されていることを考慮する必要があります。

ビュー定義とビューインスタンスクラスがどのように構造化されて実装されているか分かりませんので、AOPを使用してattributesを使用することをおすすめします。あなたのアーキテクチャに当てはまる場合は、それを検討することを強くお勧めします。カスタムアトリビュートでエントリと終了のメソッドを飾り、コンフィグレーションクラスの装飾を使用することができます。

あなたのアーキテクチャーがAOPで拡張されていない場合は、構成を書くときに文字列を使用する弱い型の解決策を使用し、それらの文字列を読むときには大量のリフレクションバック。私はそれが.NETの他の流暢なAPIのほとんどのように見えないことを知っていますが、これは本当に悪いですか?

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

な方法の一つは、あなたが渡すことによって、必要なメソッド(の名前をキャプチャすることができます。この方法は、サンプルクラスに

public void SomeMethod() { } 

を追加し、

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

にSampleBuilder.Methodの署名を変更することですメソッドグループを代理インスタンスに変換する)、適切なオーバーロードを選択します。

関連する問題