在Linq中使用变量引用属性名称

时间:2019-05-26 12:11:03

标签: c# list linq properties

我正在尝试使用下面的第一个代码访问对象中的属性“ DailyQtyOrders_01”,效果很好。 但是现在我想在第二行代码的linq表达式中使用它,这行得通,但是我希望属性是可变的(第三行代码),这会引发错误。这样做的方法是什么?

item.GetType().GetProperty("DailyQtyOrders_01").SetValue(item, 5);

productsSales.Where(x => x.sellerId == item.sellerId).FirstOrDefault().DailyQtyOrders_01 = 5;


productsSales.Where(x => x.sellerId == item.sellerId).FirstOrDefault().item.GetType().GetProperty("DailyQtyOrders_01").SetValue(item, 5);

2 个答案:

答案 0 :(得分:1)

首先,如果此代码以任何形式的循环运行,则必须小心,不要遇到性能问题。

当您输入.GetType().GetProperty().SetProperty()的区域时,您正在进行反思,这实际上不是必需的。

很难从您的代码示例中看到,但是您在项目中拥有的Order实际上应该可以直接从item.DailyQtyOrders_01进行更改。另外,如果您真的想使用字符串和反射(我无法以任何方式推荐),则至少可以使用强类型化的方法来实现(确保代码在重构时不会中断)

这将使代码如下:

item.GetType().GetProperty("DailyQtyOrders_01").SetValue(item, 5)

改为这样:

item.GetType().GetProperty(nameof(Order.DailyQtyOrders_01)).SetValue(item, 5)

在c#6.0及更高版本中可用,nameof可以用于类和属性等来获取字符串,但要避免使用实际的字符串,否则您可能无法重命名。

答案 1 :(得分:0)

问题出在第三条linq语句的最后一部分。

productsSales.Where(x => x.sellerId == item.sellerId).FirstOrDefault().item.GetType().GetProperty("DailyQtyOrders_01").SetValue(item, 5);

在上面的代码中,您将在“ item”的实例中分配“ DailyQtyOrders_01”的值。这不是您的linq查询引用的实例,而是您在上面创建/引用的变量“ item”。

.GetProperty("DailyQtyOrders_01").SetValue(item, 5);

您需要做的是将查询分为两部分,并引用要在其中设置值的实例。

例如

var itemInstance =  productsSales.Where(x => x.sellerId == item.sellerId).FirstOrDefault().item;
itemInstance.GetType().GetProperty("DailyQtyOrders_01").SetValue(itemInstance, 5);
productsSales.Where(x => x.sellerId == item.sellerId).FirstOrDefault().item = itemInstance;