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

本文关键字:表达式 方式 最佳 Lambda 属性 列表 | 更新日期: 2023-09-27 18:24:55

我有一个类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不是一个选项有人有更好的选择吗??

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

尝试使用params

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

然后你应该能够做到:

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

您可以尝试:

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不会给你属性的名称。我不知道这是否是你想要的,但这可能是一个起点。