gpt4 book ai didi

c# - 使用表达式获取方法的名称

转载 作者:IT王子 更新时间:2023-10-29 04:21:47 25 4
gpt4 key购买 nike

我知道网站上有一些关于此的答案,如果这有任何重复,我深表歉意,但我发现的所有答案都不符合我的要求。

我正在尝试指定方法信息,这样我就可以通过不使用字符串以类型安全的方式获取名称。所以我试图用表达式提取它。

假设我想获取这个接口(interface)中的一个方法的名称:

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

为了使这个可编译,我只看到两种方法:

  1. 采用非通用方式并将其参数指定为 Action<string, string>
  2. 指定 Action<string, string>作为您自己的目标委托(delegate)类型: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;
}

它适用于您的界面,但可能需要一些概括才能使其适用于任何方法,这取决于您。

关于c# - 使用表达式获取方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8225302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com