0

为什么下面的代码没有产生预期的结果?

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”。为什么不是这样?

4

2 回答 2

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 或更高版本,则可以删除nullfromGetValue并执行property.GetValue(d)...在早期版本的 .NET 中是必需的,因为没有只需要 .NET 的重载PropertyInfo

于 2013-11-05T21:57:14.433 回答
0

d.GetType().GetProperty()没有返回您认为的内容。它返回一个PropertyInfo对象,该对象描述与 Type 相关的属性,而不是特定实例,这就是您想要的。

拥有该描述对象后,您需要做的是使用该GetValue(Object)方法评估特定实例上的属性。

我相信,如果您将 LINQ 更改为(未经测试)

var query = (from d in drugList
    select d.GetType().GetProperty(jsonString).GetValue(d).ToString()).Max();

你会更接近你正在寻找的东西。

于 2013-11-05T21:58:03.207 回答