私は列挙型とデリゲートを格納するジェネリックコレクション(Dictionary)を持っています。したがって、ユーザーがメソッドにenum値をパラメータとして渡すと、コレクション内の対応するデリゲートが実行されます。Enum、Delegateデリゲートがオーバーロードされたメソッドを指すディクショナリコレクション
デリゲートが指すこのメソッドはオーバーロードされます。メソッドを呼び出すときに、実行するメソッドのバージョンを選択するにはどうすればよいですか?
ありがとうございました
私は列挙型とデリゲートを格納するジェネリックコレクション(Dictionary)を持っています。したがって、ユーザーがメソッドにenum値をパラメータとして渡すと、コレクション内の対応するデリゲートが実行されます。Enum、Delegateデリゲートがオーバーロードされたメソッドを指すディクショナリコレクション
デリゲートが指すこのメソッドはオーバーロードされます。メソッドを呼び出すときに、実行するメソッドのバージョンを選択するにはどうすればよいですか?
ありがとうございました
デリゲートは、「メソッドグループ」ではなく、単一のオーバーロードを指します。メソッドへのデリゲートを取得するまでに、すでにオーバーロードの解決が完了しています。通常、あなただけのコンパイラでこれを行うことができます。
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
を使用してください。
私はコレクションに異なるデリゲートタイプを格納することができたと思います。デリゲート自体が特定の強制プロパティ(戻り値の型/パラメータ)を持っているので、他のオーバーロードを呼び出す方法を尋ねるのは少し間近です。 – dotnetdev
異なるデリゲートタイプを格納する場合、DynamicInvokeを使用していますか?単一の型のデリゲートを格納し、型付きのInvokeを使用するのに比べて、非常に遅い*です。 –
私はInvoke()を使用していました。しかし、コードはWIPです。ありがとう(私は何か新しいことを学び、あなたの回答のすべてを調べるためのトピックを実現します)。 – dotnetdev
特定の署名としての代理人。オーバーロードを持つメソッドを持つデリゲートをインスタンス化すると、デリゲートのシグネチャに最もよく似たオーバーロードが使用されます。
これは本当に唯一の方法です。デリゲートを別のクラスにラップし、おそらく目的のデリゲートを呼び出すことができます。ハックの少し、しかし私はこれを試してみます。 – dotnetdev
あなたの状況における過負荷は正確に何ですか?列挙型はすべて同じ型ですか、つまり、デリゲートのパラメータ型宣言はすべて同じですか? (それを考えれば、それは理にかなっていない)。たぶん私は何かが欠けているかもしれませんが、ここで何らかの説明があれば助かります。 – Noldorin
デリゲートは文字列の数が異なります。また、他のデータ型を扱う代理人もいます(その場合、代理人は別のデータ型でなければなりません)。 – dotnetdev
あなたはこの質問を親切にチェックしてもらえますか?//stackoverflow.com/questions/3593218 – randomguy