在Linq中按文字文本名称选择对象

时间:2012-04-02 18:07:44

标签: c# linq

考虑这是标准的Linq

from q in SomeQuery select new SomeObject { SomeKey = q.SomeKey }

如果Somekey是我从其他地方获得的文字,那么这样的代码就不会起作用

string key = "SomeKey";
from q in SomeQuery select new SomeObject { key = q[key] }

我希望你有我的想法。当我通过文本字符串知道属性时,请告诉我编写Linq的正确方法。

2 个答案:

答案 0 :(得分:3)

在一般情况下,您正在寻找类似

的内容
var key = "SomeKey";
from q in SomeQuery select new SomeObject { 
    SomeKey = q.GetType().GetProperty("key").GetValue(q, null)
};

这会使用反射获取运行时已知的属性的值,但我发现很难推荐这样的代码。让我们看看为什么。

  1. 首先,我们无法在我们选择的匿名类型中动态定义属性的名称(这里,我将其硬编码为SomeKey)。匿名类型可能没有名称,但它们是类似于任何其他类型的类型,并且使用C#等语言,这意味着它们的成员必须在编译时知道。因此,从理论上讲,在运行时创建匿名类型是不可能的。即使可以这样做,也无法使用反射来访问匿名类型的属性。

  2. 已经将其存储在变量中时(“动态”),将“存储信息名称”作为属性名称(这是静态的)没有多大意义。如果您想传递引用,请传递key

  3. 的内容
  4. 如果要将字符串键与值相关联,则使用动态结构作为后备存储区是有意义的。例如,如果SomeQueryIEnumerable<IDictionary<string, object>>,那么您只需执行SomeKey = q[key]即可。如果没有,那么也许应该是?

  5. 如果由于某种原因你需要所有这些动力,那么合理的第一种方法是研究使用ExpandoObject

答案 1 :(得分:2)

from q in SomeQuery select 
new SomeObject { key = q.GetType().GetProperty(key).GetValue(q) }