我有一个类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不是一种选择.有没有人有更好的选择来摆脱这个?
尝试使用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)
你可以尝试:
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 会给你属性的名称。我不知道这是否是您所追求的,但这也许是一个起点。
| 归档时间: |
|
| 查看次数: |
3273 次 |
| 最近记录: |