【问题标题】:Pass different methods as parameter to invoke by method name传递不同的方法作为参数以通过方法名称调用
【发布时间】:2013-06-18 06:43:56
【问题描述】:

我在一个 Util 类中有几个方法,它们具有不同的返回类型和不同的参数,f.e:

int RealMethodToExecute(int i, string s) { ... }

这些方法必须在 ui 线程中调用,调用看起来像这样:

int x = (int)InvokeControl.Invoke("Util.RealMethodToExecute");

因为在我看来使用方法名称作为字符串并不是很漂亮,所以我想到了以下解决方案:

public int WrappedRealMethodToExecute(int i, string s)
{
    return InvokeMethod(Util.RealMethodToExecute, i, s);
}

private static T InvokeMethod<T>(Func<int, string, T> func, params object[] p)
{            
    return (T)InvokeControl.Invoke(func.Method.DeclaringType.FullName + "." + func.Method.Name, p);
}

现在的问题是 InvokeMethod 只接受带有 int 和字符串参数和返回值的方法,但我有不同的方法要执行。

我不想重载 InvokeMethod。我只需要函数的完整限定名来执行它。

有什么想法吗??

编辑:带参数的扩展示例

【问题讨论】:

  • 使用 name 来调用是一种非常糟糕的方法,但是:我可以澄清一下 - 你说的是参数吗?如果你确实提供了一个带参数的方法,你希望它从哪里获取参数值?
  • 我不明白的是,如果你可以传递一个委托,为什么不调用正常的方法呢?
  • @b_meyer 我会回到一个关卡; 为什么我们有一个“为我同步运行”方法...为什么不直接直接运行该方法? - 即int x = Util.RealMethodToExecute();
  • @b_meyer 它有点复杂,因为普通方法有一个不同于我在这里展示的签名(它是一个 gui 测试框架的扩展),我不想让这个例子更复杂
  • @MarcGravell 因为我有在被测应用程序的 ui 线程中调用的函数

标签: c# delegates


【解决方案1】:

老实说,这也可能只是:

private static object InvokeMethod(Delegate method, params object[] args)
{            
    return InvokeControl.Invoke(method, args);
}

InvokeControl.Invoke 使用的位置(进入 UI 线程):

someControl.Invoke(method, args);

【讨论】:

  • 上面已经评论过:invoke方法只允许传递函数名(字符串),不允许传递委托(很遗憾)
  • @stefantinger 听起来很奇怪,但我想你只需要做你能做的就行了
猜你喜欢
  • 2014-02-09
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
相关资源
最近更新 更多