7

System.ComponentModel.ISynchronizeInvokeを使用するオブジェクトを作成しようとしています。このオブジェクトには次のメソッドがあります:(とりわけ)

    public object Invoke(Delegate method, object[] args)

与えられた引数でメソッドを呼び出す最良の方法は何ですか?使うことができます:

    public object Invoke(Delegate method, object[] args)
    {
        return method.DynamicInvoke(args);
    }

しかし、これは遅れています。私の直感は、これがメソッドを呼び出す唯一の方法であるということです。何かアイデアはありますか?

4

1 に答える 1

4

それ以外の方法は論理的に不可能だと思います。デリゲートは、任意のシグネチャのmethodメソッドをカプセル化できます(任意の数とタイプのパラメーター、および任意のタイプの戻り値またはvoidを使用)。シグニチャを解決し、提供された引数を使用して(正しい量とタイプであることを確認した後)それを呼び出す唯一の方法は、実行時にリフレクションを使用することです。

インターフェイスを実装しておらずISynchronizeInvoke、独自のメソッドを定義できる場合methodは、特定のシグニチャのメソッドデリゲートのみを受け入れるように引数を制限できます。その場合、それらを直接呼び出すことができます。

たとえば、パラメータを受け取らず、戻り値を持つメソッドを実行するには、次を使用します。

public TResult Invoke<TResult>(Func<TResult> method)
{
    return method();
}

3つのパラメーターを取り、戻り値を持たないメソッドを実行するには、次を使用します。

public void Invoke<T1,T2,T3>(Action<T1,T2,T3> method, T1 arg1, T2 arg2, T3 arg3)
{
    method(arg1, arg2, arg3);
}
于 2012-05-12T19:41:22.767 に答える