私の意図をコードで説明する方が良いです。だから今、私は次のコードを持っています:
class A, IInterfaceUsedByB
{
}
class B
{
void func(A someObject)
{
func2(someObject, 1);
func3(someObject, "string");
func4(someObject, new MyObject());
var anotherObject = someObject.NewInstance;
func2(anotherObject, 1);
.......................
}
func2(A someObject, int val);
func3(A someObject, string val);
func4(A someObject, C val);
}
func2
、func3
、someObjectfunc4
への参照が必要な場所。これを次のように変更したい
void func(A someObject)
{
with(someObject,
() =>
{
func2(1);
func3("string");
func4(new MyObject());
}
);
var anotherObject = someObject.NewInstance;
with(anotherObject,
() =>
{
func2(1);
.......................
}
);
}
またはさらに良い
void func(A someObject)
{
func2(1);
func3("string");
func4(new MyObject());
}
この someObject をドラッグする必要はありませんが、func2,3,4 内で使用できるはずです。つまり、特定のコード ブロックにコンテキスト オブジェクトを設定するようなものです。これには、3 つの言語 (C#、F#、または IronPython) のいずれかを使用できます。
更新理想的なソリューションでは、クラス B は A から独立しています。func*
関数は、2 つのメソッドで構成される A の小さなインターフェイスにのみ依存します。
UPDATE2 someObjectは、関数呼び出しごとに異なる場合があります。
UPDATE3クラス、インターフェース、拡張メソッドなどの言語プリミティブのみでこれを行う方法はないと思います。属性、リフレクション、F# の計算ワークフロー機能など、よりハックなツールを使用して解決できる可能性があると思います。あるいは、IronPython のいくつかの動的機能かもしれません。基本的に、私がやろうとしているのは、小さな組み込み DSL を作成することです。