我知道网站上有一些关于此问题的答案,如果这有任何重复,我深表歉意,但我发现的所有答案都没有做我想做的事情。
我正在尝试指定方法信息,以便我可以通过不使用字符串以类型安全的方式获取名称。
所以我试图用一个表达式来提取它。
假设我想获取此接口中方法的名称:
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);
但所有尝试都无法编译
有没有办法做到这一点?
x => x.DoSomething
为了使其可编译,我只看到两种方法:
- 采用非通用方式并将其参数指定为
Action<string, string>
- Specify
Action<string, string>
作为您自己的目标委托类型:GetMethodInfo<IMyInteface>(x => new Action<string,string>(x.DoSomething))
如果你可以选择第二个,它允许你省略参数,那么你可以写你的GetMethodInfo
方法如下:
MemberInfo GetMethodInfo<T>(Expression<Func<T, Delegate>> expression)
{
var unaryExpression = (UnaryExpression) expression.Body;
var methodCallExpression = (MethodCallExpression) unaryExpression.Operand;
var methodInfoExpression = (ConstantExpression) methodCallExpression.Arguments.Last();
var methodInfo = (MemberInfo) methodInfoExpression.Value;
return methodInfo;
}
它适用于您的界面,但可能需要一些概括才能使其适用于任何方法,这取决于您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)