2

C# では、Action<> またはデリゲートに対して複数のメソッド シグネチャを持つオブジェクトを持つことは可能ですか? このような:

class Foo
{
    public Action<string> DoSomething;
    public Action<string, string> DoSomething;
}

class Bar
{
    public Bar()
    {
        Foo f1 = new Foo();
        f1.DoSomething = (s) => { Console.Write(s) };
        Foo f2 = new Foo();
        f2.DoSomething = (s1, s2) => { Console.Write(s1 + s2) };

        f1.DoSomething("Hi");
        f2.DoSomething("Hi","World");
    }
}

答えはノーのようですが、そのようなものを実装する適切な方法は何ですか? (これが解決しようとしていた実際の問題は、別の方法で解決されています。これは、この時点ではただの好奇心です)

4

2 に答える 2

4

Adelegate単一のメソッドの抽象化です(もちろん、同様のシグネチャを持つ複数のメソッドを単一のデリゲートで表すことができますが、呼び出し元の観点からは、単一のメソッドのように動作するため、ここでは関係ありません) 意味がありません。 1 つのメソッドが複数の署名を持つようにします。したがって、デリゲート インスタンスには特定の署名があります。オーバーロードの解決は、デリゲートには何の意味もありません。それはあなたが選択している方法グループではありません。メソッドを直接指して、「これを呼び出す」と言っています。

この問題の解決策は何ですか?

実際の問題が何であるかは私には明らかではありません。これはあなたが探しているものかもしれません:

class Foo {
    public Action<string> DoSomethingDelegate1;
    public Action<string,string> DoSomethingDelegate2;
    public void DoSomething(string s) { DoSomethingDelegate1(s); }
    public void DoSomething(string s, string t) { DoSomethingDelegate2(s, t); }
}

class Bar
{
    public Bar()
    {
        Foo f1 = new Foo();
        f1.DoSomethingDelegate1 = (s) => { Console.Write(s) };
        Foo f2 = new Foo();
        f2.DoSomethingDelegate2 = (s1, s2) => { Console.Write(s1 + s2) };

        f1.DoSomething("Hi");
        f2.DoSomething("Hi","World");
    }
}
于 2009-08-25T13:25:38.700 に答える