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

Jur*_*uri 9 .net c# lambda

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

public class MyDummyClass<T>
{
    public MyDummyClass(Expression<Func<T, object>> property)
    {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

..然后使用那个类new MyDummyClass<Person>(x=>x.Name),对吧?

但后来我不仅要传递一个属性,还要传递属性列表.所以我会写我的课

public class MyDummyClass<T>
{
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties)
    {
        ...
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

和我喜欢用它喜欢new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname })可惜就是不行!相反,我必须写

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

但这写起来有点尴尬,不是吗?当然,使用params会起作用,但这只是一段代码中的一个样本,其中使用params不是一种选择.有没有人有更好的选择来摆脱这个?

Tre*_*ley 7

尝试使用params代替:

public MyDummyClass(params Expression<Func<T, object>>[] properties)
Run Code Online (Sandbox Code Playgroud)

然后你应该能够做到:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname);
Run Code Online (Sandbox Code Playgroud)


Mot*_*oSV 4

你可以尝试:

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() );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你会这样称呼它:

MyDummyClass<Person> cls = new MyDummyClass<Person>( item => new[] { item.Name, item.Surname } );
Run Code Online (Sandbox Code Playgroud)

问题是这不会给你属性的值,因为它指定的实际 Person 实例没有在“obj”上执行 ToString 会给你属性的名称。我不知道这是否是您所追求的,但这也许是一个起点。