1

複数回呼び出すメソッドがありますが、そのたびに、異なるシグネチャを持つ異なるメソッドが内部から呼び出されます。

public void MethodOne()
{
//some stuff

*MethodCall();

//some stuff

}

したがってMethodOne、複数回呼び出され、毎回異なる*MethodCall()。私がやろうとしていることはこのようなものです:

public void MethodOne(Func<> MethodCall)
{
//some stuff

*MethodCall;

//some stuff

}

ただし、呼び出されるメソッドはそれぞれ、異なる戻りタイプと異なるパラメーターを持っています。ファンクターを使用してこれを行う方法はありますか?そうでない場合は、どうすればこれを実行できますか?

ありがとうございました!

4

4 に答える 4

1

.Net のすべてのデリゲートは、 Delegateから派生したクラスのインスタンスです。したがって、「任意の」デリゲートをメソッドに渡したい場合は、次のように渡すことができます。Delegate

それを呼び出すには、そのDynamicInvokeメソッドを使用する必要があります。

public void MethodOne(Delegate MethodCall)
{
//some stuff

//Assuming you now have the required parameters
//or add params object[] args to the signature of this method
object res = MethodCall.DynamicInvoke(args); //args is object[] representing the parameters

//some stuff
}

ただし、これはDynamicInvoke遅く、コンパイル時の安全性を提供しないため、お勧めできません。おそらく、設計を再検討する必要があります。

于 2012-10-30T11:09:21.270 に答える
1

パラメータを指定せずにパラメータを必要とする関数を呼び出すことはできないため、答えは「いいえ、不可能です」です。

また、おそらく次のものが必要です。

void MethodOne(Action a)
{
    // some stuff
    a();
    // some stuff
}

... // somewhere in the code
MethodOne((Action)(() => { DoSomethingOther(1, 2, 3); }));
MethodOne((Action)(() => { DoSomethingEvenDifferent(1, 2, 3, 4, 5); }));
于 2012-10-30T10:58:34.657 に答える
1

最善の策は、非ジェネリックAction型を使用することです (またはMethodInvoker同じになります)。つまり、

public void MethodOne(Action callback)
{
    //some stuff

    if(callback != null) callback();

    //some stuff
}

これから、呼び出し元でラップすることにより、任意のメソッドを呼び出すことができます。

MethodOne(SimpleMethod); // SimpleMethod has no parameters and returns void
MethodOne(() => MoreComplexMethod(1, "abc")); // this one returns void
MethodOne(() => { MethodThatReturnsSomething(12); }); // anything you like

于 2012-10-30T10:55:53.860 に答える
0

これは基本的にできません。戻り値の型をMethodOneジェネリックにし、パ​​ラメーターの代わりに外側のブロックを閉じるラムダを使用できます。

static void Main(string[] args)
{
    int parameterSubst = 1;
    int result = MethodOne<int>(() => parameterSubst);
    string result2 = MethodOne<string>(() =>
    {
        string s = parameterSubst.ToString();
        s += "foo";
        return s;
    });
}

static T MethodOne<T>(Func<T> function)
{
    return function();
}

ご覧のとおり、parameterSubstは渡されたFunc<T>s で使用されていますが、パラメーターとしては使用されていません。

于 2012-10-30T10:59:26.653 に答える