为什么以下代码不会产生预期结果?
public string LinqTest()
{
//hardcoded here for clarity's sake
//real code will hit a database
var jsonString = "DrugClass";
List<Drugs> drugList = new List<Drugs>()
{
new Drugs() { DrugId=1, DrugClass="HHH", DrugDosage=120, DrugName="Drug1"},
new Drugs() { DrugId=2, DrugClass="H2H", DrugDosage=100, DrugName="Drug2"},
new Drugs() { DrugId=3, DrugClass="HHH", DrugDosage=100, DrugName="Drug3"},
new Drugs() { DrugId=4, DrugClass="WA2", DrugDosage=200, DrugName="Drug4"}
};
var query = (from d in drugList
select d.GetType().GetProperty(jsonString)).Max();
return query.ToString();
}
我希望这段代码从您上面看到的集合中选择属性DrugClass并返回“WA2”。为什么不是这种情况?
答案 0 :(得分:3)
如果您从这段代码中取消.Max()
,您会看到它返回IEnumerable<PropertyInfo>
...而不是您想要的。
var query = (from d in drugList
select d.GetType().GetProperty(jsonString)).Max();
你几乎就在那里......一旦你得到PropertyInfo
类,就可以使用它的GetValue
方法从该类的实际实例中获取该属性的值。
在下面的代码中,我从获取特定let property = ...
类的值(最后一行)的代码中分离出获取属性的代码(Drugs
语句)评估。这应该适合你(在LINQPad中为我工作)。
var query = (from d in drugList
let property = d.GetType().GetProperty(jsonString)
select property.GetValue(d, null)).Max();
注意:如果您使用的是.NET 4.5或更高版本,则可以从null
删除GetValue
,然后执行property.GetValue(d)
...在早期版本的.NET中需要它因为没有超载只需要PropertyInfo
。
答案 1 :(得分:0)
d.GetType().GetProperty()
没有回复你的想法。它返回一个PropertyInfo
对象,该对象描述与Type相关的属性,而不是特定实例,这是您想要的。
拥有该描述对象后需要执行的操作是使用GetValue(Object)
方法评估特定实例上的属性。
我相信,如果你将LINQ更改为(未经测试的)
var query = (from d in drugList
select d.GetType().GetProperty(jsonString).GetValue(d).ToString()).Max();
你会更接近你正在寻找的东西。