【问题标题】:When to use Expression何时使用表达式
【发布时间】:2011-10-11 16:34:52
【问题描述】:

我正在尝试确定使用什么...

我需要将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
}

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

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

WriteData(persons); 

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

【问题讨论】:

  • 如果您真的有兴趣学习如何利用表达式和IQueryable 界面,我强烈建议您阅读Matt Warren 的LINQ: Building an IQueryable provider series。警告:元编程可能很复杂,需要时间和耐心
  • @smartcaveman:谢谢,我去看看。

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


【解决方案1】:

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

请注意,很少在 ExpressionIEnumerable&lt;T&gt; 之间进行选择 - 通常是在表达式树和委托之间,或者在 IEnumerable&lt;T&gt;IQueryable&lt;T&gt; 之间。

【讨论】:

  • 谢谢...只是想弄清楚我需要使用什么。我不想使用反射......但我也没有更好的解决方案。
  • @IAbstract:那么不清楚你做什么想做什么。为什么你认为表达式树会添加任何东西? Expression&lt;IEnumerable&lt;Person&gt;&gt; 甚至不是一个真实的类型,因为Expression&lt;T&gt; 中的T 应该总是真的是一个委托类型。
  • 好吧,好吧,这是有道理的——Expression&lt;IEnumerable&lt;Person&gt;&gt; 看起来很奇怪,看起来不太对劲。在没有任何其他专业知识的情况下,我正在冒险尝试一些不同的东西。
【解决方案2】:

我不知道你会用表达式做什么,但这大致就是我使用反射所做的。

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 来将方法限制为仅限于您的数据对象。

【讨论】:

  • 对,我认为这是@JonSkeet 所说的我应该做的。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2010-10-14
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多