将属性名称列表作为Lambda表达式传递的最佳方法

时间:2012-02-17 15:39:19

标签: c# .net lambda

我有一个类MyDummyClass,我希望以Lambda表达式的形式传递一些属性,以便以后进行评估。那么我可以做些什么,比如

public class MyDummyClass<T>
{
    public MyDummyClass(Expression<Func<T, object>> property)
    {
        ...
    }
    ...
}

..然后使用像new MyDummyClass<Person>(x=>x.Name)那样的类,对吗?

但是我不仅要传递一个属性,还要传递属性列表。所以我会把我的课写成

public class MyDummyClass<T>
{
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties)
    {
        ...
    }
    ...
}

并且喜欢new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname })一样使用它,但不幸的是不起作用!相反,我必须写

new MyDummyClass<Person>
     (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname});

但这写起来有点尴尬,不是吗?当然,使用 params 会有效,但这只是一段代码中的一个示例,其中使用params不是一个选项任何人都有更好的选择来摆脱这个吗?

2 个答案:

答案 0 :(得分:7)

尝试使用 params

public MyDummyClass(params Expression<Func<T, object>>[] properties)

然后你应该能够做到:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname);

答案 1 :(得分:3)

你可以尝试:

public class MyDummyClass<T>
{
    public MyDummyClass(Expression<Func<T, object>> expression)
    {
        NewArrayExpression array = expression.Body as NewArrayExpression;
        foreach( object obj in ( IEnumerable<object> )( array.Expressions ) )
        {
            Debug.Write( obj.ToString() );
        }
    }
}

然后你会这样称呼它:

MyDummyClass<Person> cls = new MyDummyClass<Person>( item => new[] { item.Name, item.Surname } );

问题是这不会为您提供属性的值,因为它没有指定实际的Person实例在“obj”上执行ToString将为您提供属性的名称。我不知道这是不是你想要的,但它可能是一个起点。