Action<>
のインスタンスを作成するのに苦労しています。MethodInfo
の私はリフレクションを使用して取得できます。ジェネリックメソッドを使用したインターフェイスのインスタンスをアクションに変換する
以下の例を使用して、オブジェクトに対してカスタムメソッドを簡単に呼び出すことができますが、実際にはそれらをアクションに変換したいと考えています。
私はDelegate.CreateDelegate
を使ってやってみましたが、ジェネリック型のアクションを返すようには思えません。私は、次のインターフェイス作成した
例:次に
interface IMyTest { } // Marker interface
interface<TInput> IMyTest : IMyTest {
void MyMethod(TInput input);
}
は、私はクラスのインターフェイス継承:
class MyClass : IMyTest<DateTime>, IMyTest<int> {
void MyMethod(DateTime input) {
// Do something
}
void MyMethod(int input) {
// Do something else
}
}
をそして私は、リフレクションを使用するメソッドを作成しますインタフェースインスタンスから「MyMethod」を見つけて呼び出す:
void DoCallMyMethod(object target, object input) {
IEnumerable<Type> interfaces = target.GetType().GetInterfaces()
.Where(x => typeof(IMyTest).IsAssignableFrom(x) && x.IsGenericType);
foreach (Type @interface in interfaces) {
Type type = @interface.GetGenericArguments()[0];
MethodInfo method = @interface.GetMethod("MyMethod", new Type[] { type });
if (method != null) {
method.Invoke(target, new[] { input });
}
}
}
そして最後に、私はそれをすべて一緒に置く:
MyClass foo = new MyClass();
DoCallMyMethod(foo, DateTime.Now);
DoCallMyMethod(foo, 47);
を結果は何かになるように、私はDoCallMyMethod
インサイド
をしたいと思う私はMethodInfo method
汎用Action
に変換したいと思いますこのように:
Action<type> myAction = method;
しかし、th明らかに動作しません。
は、私はいくつかの類似したSOの記事を見つけました次のような答えになってしまった(しかし、正確に私の場合をカバーなし):Action<object> action =
(Action<object>)Delegate.CreateDelegate(typeof(Action<object>), target, method);
をしかし、「ターゲットメソッドにバインドすることはできませんので、これは動作しません。その署名またはセキュリティの透過性がデリゲート型のものと互換性がないためです。
type
の入力を、オブジェクト参照を保持したまま(新しいインスタンスが表示されないまま)、入力としてどのように取得できますか?
何とか動作しますが、あなたの答えから推測できない質問がもう1つあります(質問からは不明な点があります)。入力のタイプを知らなくても 'delegate'を取得したら、どうすれば汎用アクション<>を取得できますか?例えば、私が 'AddExternalCaller(アクションコールバック)'メソッドを持っていれば、 'callback'は' MyMethod'の変種の1つになります。 'List >'のグローバルコレクションにアクションを追加するために、 'AddExternalCaller()'と 'DoCallMyMethod()'の両方をどうやって取得できますか? –
GTHvidsten
@GTHvidsten:しかし、 'Action'や 'Action 'のような '' Action 'は '' Action
'Action'から 'Action 'に変換したのは、次の構文で変換する方法です: 'void convert (アクションコールバック){アクション foo = input =>コールバック((T)入力) ; } '。私はダイナミックデリゲートをアクションに変換することができました: 'Action handler = request => @ delegate.DynamicInvoke(request);'。現時点では私のシナリオでもうまくいきます。これに特有の欠点がありますか? –
GTHvidsten