2012-02-23 4 views
4

大丈夫です、私はこの質問のタイトルが理にかなっていることを願っています。私のアプリケーションでは、特別なInvokeMethodによって呼び出されるべきいくつかのメソッドがあります。現時点では、それは次のように動作します。は、invokeMethodを呼び出すにはFuncデリゲートのよりよい(一般的な)宣言

internal bool RemoteLogin(string password) 
{ 
    return (bool)InvokeMethod(new Func<string, bool>(Server.RemoteLogin), password);    
} 

internal string GetSessionId() 
{    
    return (string)InvokeMethod(new Func<string>(Server.GetSessionId));      
} 

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

私は....新しいのFunc <を渡す必要があり>、パラメータ(複数可)を追加しても、適切な型に戻り値をキャスト。ジェネリックスやリフレクションを使用するなど、より優れた(より一般的な)方法がありますか?

ご協力いただきまして誠にありがとうございます。

+2

なぜメソッドを直接呼び出さないのですか?なぜDelegate.DynamicInvokeをここで使用しますか? –

+2

上記の私の例では、メソッドInvokeMethodは単純化されています。私のアプリでは、ログ、モニタ、例外処理などの呼び出しを行います。 – Mike

答えて

3

一定の強固なタイピングを達成するには、Funcのバリエーションを使用して繰返しを犠牲にしてください:

public R InvokeMethod<T,R>(Func<T,R> method, T argument) 
{ 
    return method(argument); 
} 

public R InvokeMethod<T1,T2,R>(Func<T1,T2,R> method, T1 argument1, T2 argument2) 
{ 
    return method(argument1, argument2); 
} 

public R InvokeMethod<T1,T2,T3,R>(Func<T1,T2,T3,R> method, T1 argument1, T2 argument2, T3 argument3) 
{ 
    return method(argument1, argument2, argument3); 
} 

など。

これはオリジナルと一致していますが、パラメータを実際に処理する必要はありません。あなたのInvokeMethodこのように書いてみてください。そして、

public R InvokeMethod<R>(Func<R> method) 
{ 
    return method(); 
} 

と、このスタイルでそれを呼び出す:

internal bool RemoteLogin(string password) 
{ 
    return InvokeMethod(() => Server.RemoteLogin(password)); 
} 

internal string GetSessionId() 
{    
    return InvokeMethod(() => Server.GetSessionId()); 
} 

この方法で、あなたは、ラムダ式にパラメータ処理を残して、あなたは一度だけは、invokeMethodを記述する必要があります。

+1

それは私が探していたものです!あなたの答えに感謝します。また、他のすべての人に感謝しています。 – Mike

1

私はReedに、実際に直接メソッドを呼び出して冗長なコードを取り除くことに同意しますが、これらの作業を行うときに強く入力する必要がある場合は、InvokeMethodコールを書き換えることは非常に簡単です。

public static T InvokeMethod<T>(Delegate method, params object[] args) 
{ 
    return (T)method.DynamicInvoke(args); 
} 

そして、上記のお電話は、ちょうど次のようになります。

return InvokeMethod(new Func<string, bool>(Server.RemoteLogin), password); 

そしてBoolean戻り値の型は、あなたの方法上の戻り値の型によって推測されます。

2

"上記の私の例では、メソッドInvokeMethodは単純化されています。私のアプリケーションでは、ログ、モニタ、例外処理などの呼び出しを行います。

このコメントをいただいた場合、私はこれを再作成することを提案します。代わりに、このようデリゲートを呼び出すには、操作を行うことができそうのように、Func<T>を取る:

public T InvokeMethod<T>(Func<T> method) 
{ 
    // Add wrapper as needed 
    return method(); 
} 

あなたは、あなたがパラメータを渡す必要があるときラムダを使用して、それを呼び出すことができます。

internal bool RemoteLogin(string password) 
{ 
    return InvokeMethod(() => Server.RemoteLogin(password));    
} 

internal string GetSessionId() 
{    
    return InvokeMethod(Server.GetSessionId);      
} 
1
static T Invoke<T>(Func<T> method) 
{ 
    //Log here 
    return method(); 
} 

bool RemoteLogin(string password) 
{ 
    return Invoke(() => Server.RemoteLogin(password)); 
} 
1

追加情報:メソッドに戻り値がない場合(例えば、 "void Logout()")、アクション代理人を使用できます(異なる署名/パラメータのため、同じ名前のメソッドにInvokeMethodがあります)。

public void InvokeMethod(Action method) 
{ 
    method(); 
} 
関連する問題