【发布时间】:2012-01-03 17:57:28
【问题描述】:
我知道网站上有一些关于这个的答案,如果这有任何重复,我深表歉意,但我发现的所有答案都没有做我想做的事情。
我正在尝试指定方法信息,以便我可以通过不使用字符串以类型安全的方式获取名称。 所以我试图用一个表达式来提取它。
假设我想在这个接口中获取一个方法的名称:
public interface IMyInteface
{
void DoSomething(string param1, string param2);
}
目前我可以使用此方法获取名称:
MemberInfo GetMethodInfo<T>(Expression<Action<T>> expression)
{
return ((MethodCallExpression)expression.Body).Method;
}
我可以如下调用辅助方法:
var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething(null, null));
Console.WriteLine(methodInfo.Name);
但我正在寻找不指定参数(null,null)就可以获取方法名称的版本
像这样:
var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething);
但是所有尝试都编译失败
有没有办法做到这一点?
【问题讨论】:
-
目前没有 VS,但我认为您应该尝试接受
Delegate或Action<string, string>在非通用替代方案中。在这种情况下,您应该能够传递一个方法组 -
如果我将输入更改为 Delegate,它将无法编译,并且错误是无法将方法组转换为委托。如果我将其更改为 Action
它似乎可以工作,但表达式被转换为 UnaryExpression 并且该方法为空,我无法看到从 UnaryExpression 获取它的位置 -
转换后..你试过
var methodInfo = GetMethodInfo<IMyInteface>(DoSomething);而不是var methodInfo = GetMethodInfo<IMyInteface>(x => x.DoSomething);吗?另外,我仍然认为指定 (default(string), default(string)) - 更具可读性,并且在这种情况下您可以支持重载方法 -
我不能通过直接指定做某事来使用 GetMethodInfo(DoSomething) 我需要引用实例,但是没有实例,这就是为什么它必须是一个表达式,IMyInterface 从来没有实际调用过具体实例,但仅用于提取元数据。我不知道我是否有意义
标签: c# expression lambda