2009-04-03 4 views
2

私は列挙型とデリゲートを格納するジェネリックコレクション(Dictionary)を持っています。したがって、ユーザーがメソッドにenum値をパラメータとして渡すと、コレクション内の対応するデリゲートが実行されます。Enum、Delegateデリゲートがオーバーロードされたメソッドを指すディクショナリコレクション

デリゲートが指すこのメソッドはオーバーロードされます。メソッドを呼び出すときに、実行するメソッドのバージョンを選択するにはどうすればよいですか?

ありがとうございました

+0

あなたの状況における過負荷は正確に何ですか?列挙型はすべて同じ型ですか、つまり、デリゲートのパラメータ型宣言はすべて同じですか? (それを考えれば、それは理にかなっていない)。たぶん私は何かが欠けているかもしれませんが、ここで何らかの説明があれば助かります。 – Noldorin

+0

デリゲートは文字列の数が異なります。また、他のデータ型を扱う代理人もいます(その場合、代理人は別のデータ型でなければなりません)。 – dotnetdev

+0

あなたはこの質問を親切にチェックしてもらえますか?//stackoverflow.com/questions/3593218 – randomguy

答えて

3

デリゲートは、「メソッドグループ」ではなく、単一のオーバーロードを指します。メソッドへのデリゲートを取得するまでに、すでにオーバーロードの解決が完了しています。通常、あなただけのコンパイラでこれを行うことができます。

using System; 
class Foo { 
    int Bar() { return 1; } 
    void Bar(int a) { } 
    static void Main() { 
     Foo foo = new Foo(); 
     Func<int> myDelegate = foo.Bar; // points to "int Bar()" version 
    } 
} 

質問はリフレクション経由でオーバーロードされたメソッドを取得に関連する場合 - その後、あなたは(Type[]として)Type.GetMethod()に引数でパターンを指定することができます。これは、あなたが望む方法を与えるはずです。

MethodInfoからデリゲートを取得するには、Delegate.CreateDelegateを使用してください。

+0

私はコレクションに異なるデリゲートタイプを格納することができたと思います。デリゲート自体が特定の強制プロパティ(戻り値の型/パラメータ)を持っているので、他のオーバーロードを呼び出す方法を尋ねるのは少し間近です。 – dotnetdev

+0

異なるデリゲートタイプを格納する場合、DynamicInvokeを使用していますか?単一の型のデリゲートを格納し、型付きのInvokeを使用するのに比べて、非常に遅い*です。 –

+0

私はInvoke()を使用していました。しかし、コードはWIPです。ありがとう(私は何か新しいことを学び、あなたの回答のすべてを調べるためのトピックを実現します)。 – dotnetdev

0

特定の署名としての代理人。オーバーロードを持つメソッドを持つデリゲートをインスタンス化すると、デリゲートのシグネチャに最もよく似たオーバーロードが使用されます。

+0

これは本当に唯一の方法です。デリゲートを別のクラスにラップし、おそらく目的のデリゲートを呼び出すことができます。ハックの少し、しかし私はこれを試してみます。 – dotnetdev

関連する問題