将属性名称列表作为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不是一个选项。有人有更好的选择吗??
尝试使用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不会给你属性的名称。我不知道这是否是你想要的,但这可能是一个起点。