好的,我希望这个问题的标题有意义。在我的应用程序中,我有一些方法应该由特殊的 InvokeMethod 调用。目前,它是这样工作的:
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);
}
要调用 InvokeMethod,我必须传递一个新的 Func,添加参数并将返回值转换为适当的类型。有没有更好(更通用)的方法来做到这一点,例如使用泛型或反射?
任何帮助都受到高度赞赏。
最佳答案
您可以通过使用 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());
}
这样,您将参数处理留给 lambda 表达式,您只需编写一次 InvokeMethod。
关于c# - Func 委托(delegate)的更好(通用)声明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9405446/