如何将lambda表达式传递给期望lambda表达式的方法?

时间:2015-11-03 10:28:40

标签: c# lambda expression-trees

我有一个扩展方法来获取属性名称为string:

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

现在我有另一个方法,期望传入这种属性lamba表达式的列表(param)。 我希望这种新方法能够重用第一种方法,但无法弄清楚如何将其传递给

    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:

,后面的答案就可以了
    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));
    }

1 个答案:

答案 0 :(得分:1)

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

OR

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

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