何时使用Expression

时间:2011-10-11 16:34:52

标签: c# .net-4.0 expression-trees

我正在尝试确定要使用的内容......

我需要将IEnumerable<TSource>传递给将实体成员的值写入文件的函数。这是IEnumerable的样子:

var persons = new[] {
    new Person {
        RecordID = 0,
        PersonFName = "Joe",
        PersonMName = "",
        PersonLName = "Smith",
        PersonZip="75227"
    }, 
    new Person {
        RecordID = 1,
        PersonFName = "Mary",
        PersonMName = "Hada",
        PersonLName = "Lamb",
        PersonZip="75217"
    }};

将IEnumerable传递给读取每个实体的函数以便读取每个字段值的最佳方法是什么?

我在想我会使用类似的东西:

void WriteData<TSource>(Expression<IEnumerable<Person>> expression)
{
    // do stuff
}

我无法找到解释如何确定何时使用Expression而不仅仅是传递IEnumerable的资源。然后,如何创建反映persons的表达式?

理想情况下,似乎我会像这样调用WriteData:

WriteData(persons); 

我是否朝着正确的方向前进?

2 个答案:

答案 0 :(得分:5)

我认为没有理由在那里使用表达式树。如果你只是想通过反射来获取所有属性,我建议你这样做 - 表达式树不会真的帮助你做到这一点。

请注意,ExpressionIEnumerable<T>之间的选择很少 - 它通常位于表达式树和委托之间,或者位于IEnumerable<T>IQueryable<T>之间。

答案 1 :(得分:0)

我不知道你对表达式做了什么,但这大致是我用反射做的事情。

public void WriteData<T>(IEnumerable<T> objects) where T : class
{
  foreach (var obj in objects)
  {
    WriteObjectData(obj);
  }
}

private void WriteObjectData<T>(T obj) where T : class
{
    foreach (var propertyInfo in typeof(T).GetProperties())
    {
        // Use propertyInfo.GetValue to get the value from obj. 
    }
}

如果您愿意,可以指定一个界面而不是where T:class来将方法限制为仅数据对象。