【问题标题】:C# - take method as an argument without specifying argsC# - 将方法作为参数而不指定参数
【发布时间】:2016-07-18 17:29:43
【问题描述】:

我有一个方法需要将函数及其所有者类作为输入参数,然后通过反射处理其名称。当然我可以取几个strings 作为输入参数,所以方法看起来像这样:

void Proceed(string className, string methodName)
{
  Console.WriteLine($"{className}.{methodName} called");
  //...
}

并且会这样调用:

Proceed(nameof(Foo), nameof(Foo.Bar));

但我想知道是否有任何方法可以避免每次尝试调用该方法时都编写nameof 关键字。对我来说,Proceed<Foo>(f => f.Bar) 这样的东西看起来会更好。

我想这可以通过表达式来解决。我面临的问题是,如果方法 Bar 有参数,则必须在调用该方法时明确指定它们(在我的情况下这似乎过多,您以后只需要 方法的名称 )。

所以,我设法找到的最佳解决方案是this one

void Proceed<T>(Expression<Func<T, Action<object, object>>> expression)
{
//...
}

但它仍然在自己的 args 中指定参数方法的签名,因此不够通用。

我想知道是否有某种方法可以在不指定参数的情况下将函数作为参数传递(前提是我以后只需要它的名称,就像 nameof 关键字一样)。

【问题讨论】:

标签: c# reflection nameof


【解决方案1】:

我认为您正在寻找事件或委托的用法。

您可以在网上查找有关这 2 个的更多信息。想法是它们存储一些具有相同参数的方法,以便稍后它知道您需要调用哪种类型的参数。

【讨论】:

  • 我认为,如果您在答案中定义术语而不是简单地建议原始提问者在线查找术语,这将有所帮助。毕竟,StackOverflow.com 是在线的。
【解决方案2】:

是的,使用 Delegate 关键字。

查看答案here

【讨论】:

  • 如果您只是要链接到另一个答案,为什么不将其标记为重复?
  • 重复的问题和重复的答案是有区别的。见here
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多