0

私は次のようなメソッドを渡すことができることを知っています:

Class A:
public void foo(Action<Class, Class, Class> bar)
{
    Class a;
    Class b;
    Class c;
    bar(a, b, c);
}
Class B:
public main()
{
    foo(bar);
}
protected void bar(Class a, Class b, Class c);

しかし、私はそれをもっと条件付きにしたい:

Class A:
public void foo(bar) {
    Class a;
    Class b;
    Class c;
    Class d;
    if(condition A)
        bar(a, b, c);
    else
        bar(a, b, c, d);
}
Class B:
public main()
{
    foo(bar);
}
protected void bar(Class a, Class b, Class c);
protected void bar(Class a, Class b, Class c, Class d);

どうすればいいですか?

4

2 に答える 2

1

2 つの関数に別の名前を付けて、2 つのbar関数をオーバーロードfooし、条件を からfooに移動することができmainます。

    protected void bar1(int a, int b, int c)
    {
        Console.WriteLine("a={0}, b={1}, c={2}", a, b, c);
    }

    protected void bar2(int a, int b, int c, int d)
    {
        Console.WriteLine("a={0}, b={1}, c={2}, d={3}", a, b, c, d);
    }

    public void foo(Action<int, int, int> bar)
    {
        int a = 1;
        int b = 2;
        int c = 3;
        bar1(a, b, c);
    }

    public void foo(Action<int, int, int, int> bar)
    {
        int a = 1;
        int b = 2;
        int c = 3;
        int d = 4;
        bar2(a, b, c, d);
    }

    public void main()
    {
        if (condition)
            foo(bar1);
        else
            foo(bar2);
    }
于 2013-01-30T11:14:06.210 に答える
1

by-name を文字列として渡し、次にリフレクションを使用する以外に、メソッド グループ (同じ名前で署名が異なるメソッドのセット) を渡す方法はありません。//Delegate表現はExpression単一MethodInfoのメソッドでなければなりません。

だから:あなたはできません。


提案:

interface IBar {
    void bar(Class a, Class b, Class c);
    void bar(Class a, Class b, Class c, Class d);
}
class YourType : IBar {
    void IBar.bar(Class a, Class b, Class c) {...}
    void IBar.bar(Class a, Class b, Class c, Class d) {...}
    ...
    public main()
    {
        foo(this);
    }
}
于 2013-01-30T11:01:38.877 に答える