我有一个类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不是一个选项。 任何人都有更好的选择来摆脱这个吗?
答案 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将为您提供属性的名称。我不知道这是不是你想要的,但它可能是一个起点。