如何编写lambda表达式使用分隔符获取属性集合?

时间:2011-09-25 00:53:31

标签: c# lambda

我不确定如何创建此表达式:

(e => e.Prop1, e.Prop2, e.Prop3)

我想将这样的表达式传递给方法,这样我就可以遍历集合并提取属性名称。

伪方法:

public  void ParseProperties<T>(The_Expression_being_Passed_In)
{
    foreach(var member in expression.members)
    {
       .....
    }
}

2 个答案:

答案 0 :(得分:1)

您需要接受

类型的参数
params Expression<Func<T, object>>[] expressions

所以你可以说

public void ParseProperties<T>(params Expression<Func<T, object>>[] expressions) {
    foreach(var expression in expressions) {
        expression.GetPropertyName();
    }
}

你必须写GetPropertyName; StackOverflow上的实现比比皆是。

你不能像你想要的那样称呼它。你不得不说

ParseProperties(e => e.Prop1, e => e.Prop2, e => e.Prop3);

答案 1 :(得分:-1)

你可以尝试这样的东西,但如果你试图使用值类型属性,它可能会爆炸,因为表达式很可能是一个强制转换表达式。

public PropertyInfo ParseProperty<T>(Expression<Func<T,object>> expr)
{
       MemberExpression member;
       if(expr == null) 
              throw new ArgumentNullException("expr");
       if((member = expr.Body as MemberExpression) == null) 
              throw new ArgumentException("incorrect format");
       return member.Member as PropertyInfo;
}

public PropertyInfo[] ParseProperties<T>(params Expression<Func<T,object>> expressions)
{
      return Array.ConvertAll(expressions,ParseProperty);
}