我正在尝试使用下面的第一个代码访问对象中的属性“ 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);
答案 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;