我正在尝试确定要使用的内容......
我需要将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);
我是否朝着正确的方向前进?
答案 0 :(得分:5)
我认为没有理由在那里使用表达式树。如果你只是想通过反射来获取所有属性,我建议你这样做 - 表达式树不会真的帮助你做到这一点。
请注意,Expression
和IEnumerable<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
来将方法限制为仅数据对象。