【问题标题】:How to pass a lambda expression to a method expecting lambda expression?如何将 lambda 表达式传递给期望 lambda 表达式的方法?
【发布时间】:2025-12-09 23:10:01
【问题描述】:

我有一个扩展方法来获取属性名作为字符串:

    public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
    {
        return ((MemberExpression)propertyId.Body).Member.Name;
    }

现在我有另一种方法,期望传入这种属性lamba表达式的列表(参数)。 我希望这个新方法可以重用第一种方法,但不知道如何通过它

    public string Test<T>(params Expression<Func<T, object>>[] ps)
    {
        foreach (var p in ps)
        {
                var howToCodeThis = p.GetPropertyName(dummy => dummy);

预期用途:

                var result = Test<Something>(request.Sorting
                , x => x.prop1
                , x => x.prop2
                , x => x.prop3
                );

更新: 一旦我更改了 GetPropertyName 以适应 UnaryExpression,Backs 的答案就起作用了:

    public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
    {
        if (propertyId.Body is MemberExpression)
            return ((MemberExpression)propertyId.Body).Member.Name;

        if (propertyId.Body is UnaryExpression)
        {
            var op = ((UnaryExpression)propertyId.Body).Operand;
            return ((MemberExpression)op).Member.Name;
        }

        throw new NotImplementedException(string.Format("GetPropertyName - {0}", propertyId.Body.GetType().FullName));
    }

【问题讨论】:

  • 不久前我问了一个非常相似的问题:*.com/questions/30734899/…
  • 我对你的问题投了赞成票。我真的很讨厌人们无缘无故地否决一个问题。
  • 谢谢。如果有解释,投反对票会很有帮助,我同意你的看法。

标签: c# lambda expression-trees


【解决方案1】:
var howToCodeThis = GetPropertyName(default(T), p);

var howToCodeThis = default(T).GetPropertyName(p);

但我注意到,您没有在 GetPropertyName 方法中使用 obj

【讨论】:

  • 我认为obj 的原因在于推断类型参数有效。
  • 该方法是一个扩展,这就是编码语法的方式。使用它就是这样 myObj.GetPropertyName(x => x.Prop)
  • 我只能使用第二个选项,因为该方法是扩展方法。它不起作用,给出错误:无法将“System.Linq.Expressions.UnaryExpression”类型的对象转换为“System.Linq.Expressions.MemberExpression”
  • 问题是由于我的 GetPropertyName。我发布了关于此的更新,您的回答有效。