好的,我希望这个问题的标题有意义。在我的应用程序中,我有一些方法应该由特殊的 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/

10-08 22:47