【发布时间】: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 关键字一样)。
【问题讨论】:
-
就像@HansPassant 提到的那样,您可以轻松获取成员名称,但无法获取类型名称。除了捕获
this之外,我看不到使用表达树的任何优势,但成本更高,您可以编写 Roslyn 分析器以确保传递正确的参数。
标签: c# reflection nameof