gpt4 book ai didi

c# - 从表达式中获取方法名称

转载 作者:行者123 更新时间:2023-12-02 05:01:43 26 4
gpt4 key购买 nike

给定以下方法签名:

string GetActionName<TController, T1, TResult>(Expression<Func<TController, Func<T1, TResult>>> expression)

如何从以下实现中获取方法名称:

GetActionName<EventsController, int, IEnumerable<EventDto>>(c => c.GetEventsByIdLocation);

其中 GetEventsById 具有以下签名:

IEnumerable<EventDto> GetEventsByIdLocation(int id)

我目前的尝试是给了我异常(exception):

Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.MemberExpression'.

var convertExpression = (UnaryExpression)expression.Body;
var memberExpression = (MemberExpression)convertExpression.Operand;
return memberExpression.Member.Name;

enter image description here

最佳答案

主要问题是在您的调用中,您实际上并没有调用该方法,而是返回了它。这导致表达式树包含对名为 CreateDelegate 的方法的调用。一旦我们在 methodCallExpression 中有了它,我们就需要提取对象并读取它的值,这就是您的方法。

免责声明:这适用于我认为与您相同的场景。但是,如果它是解决我不知道的更大问题的最佳方法。它似乎相当慢。

var unaryExpression = (UnaryExpression)expression.Body;
var methodCallExpression = (MethodCallExpression)unaryExpression.Operand;
var constantExpression = (ContantExpression)methodCallExpression.Object;
var methodInfo = (MethodInfo)constantExpression.Value;
return methodInfo.Name

另一种选择是提供对方法的实际方法调用,如下所示:

GetActionName<EventsController, IEnumerable<EventDto>>(
c => c.GetEventsByIdLocation(0));

这需要您将方法更改为:

string GetActionName<TController, TResult>(
Expression<Func<TController, TResult>> expression)
{
return ((MethodCallExpression)expression.Body).Method.Name;
}

此解决方案的执行速度可能会快得多。尽管我没有做任何基准测试或任何事情。此外,此选项不会限制您只能获取采用一个 int 参数的方法的名称。

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

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