考虑这是标准的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的正确方法。
答案 0 :(得分:3)
在一般情况下,您正在寻找类似
的内容var key = "SomeKey";
from q in SomeQuery select new SomeObject {
SomeKey = q.GetType().GetProperty("key").GetValue(q, null)
};
这会使用反射获取运行时已知的属性的值,但我发现很难推荐这样的代码。让我们看看为什么。
首先,我们无法在我们选择的匿名类型中动态定义属性的名称(这里,我将其硬编码为SomeKey
)。匿名类型可能没有名称,但它们是类似于任何其他类型的类型,并且使用C#等语言,这意味着它们的成员必须在编译时知道。因此,从理论上讲,在运行时创建匿名类型是不可能的。即使可以这样做,也无法使用反射来访问匿名类型的属性。
当已经将其存储在变量中时(“动态”),将“存储信息名称”作为属性名称(这是静态的)没有多大意义。如果您想传递引用,请传递key
。
如果要将字符串键与值相关联,则使用动态结构作为后备存储区是有意义的。例如,如果SomeQuery
为IEnumerable<IDictionary<string, object>>
,那么您只需执行SomeKey = q[key]
即可。如果没有,那么也许应该是?
如果由于某种原因你需要所有这些动力,那么合理的第一种方法是研究使用ExpandoObject
。
答案 1 :(得分:2)
from q in SomeQuery select
new SomeObject { key = q.GetType().GetProperty(key).GetValue(q) }