【问题标题】:Dynamic Linq FirstOrDefault Statement动态 Linq FirstOrDefault 语句
【发布时间】:2020-01-19 16:09:59
【问题描述】:

使用 C# 7+,我通过 FirstOrDefault() 语句实例化一个变量。但它在整个代码中针对不同的变量重复出现。我想知道是否/如何动态构建这些语句。这是我目前拥有的(注意变量名称与DataTable名称匹配)

var generalSolution = this.GeneralSolution.FirstOrDefault();
var pieceModel = this.PieceModel.FirstOrDefault();
.... many more of these same variable declarations.....

我想做的是给定一个字符串列表,迭代地创建每个变量。比如:

foreach(var item in list)
{
    var somename = this."item".FirstOrDefault();
}

这有可能吗?

【问题讨论】:

  • 您可以使用反射System.Reflection.FieldInfo 获取字段,但是如何在foreach 循环中创建变量?
  • 本地,旨在作为参数值传递给某些存储过程。我来自 DBA 背景,并开始使用实际上是 100 行这些类型的变量赋值的代码 - 特别是 var nameofthing = this.nameofthing.FirstOrDefault()。由于这种具体的模式,似乎必须有更好的方法来以编程方式执行此操作(我可能错了!)
  • “更好”是主观的。米克尔森迈克尔提到了反思,是的,你可以这样做,但正如我喜欢说的,“反思是疯狂的科学”。您不再为目标编程;您正在编程以达到目标[原文如此]。换句话说,它是元编程。您的代码的意图可能会丢失,从而降低可维护性。坦率地说,试图简化这种模式可能不是你精力的最佳利用。
  • 这似乎是XY Problem。也许有了更多信息,您会得到更多有用的答案。比如GeneralSolutionPieceModel的类型有哪些?想想当您不知道变量的名称甚至不知道它们存在时,您会如何编写代码来使用这些变量?
  • 您似乎从疯子甚至可能是承包商那里继承了代码,但如果代码工作可靠,您最好保留它。另一种选择是完全重构它,而不是仅仅清理奇怪的习语,同时让本质的恐怖完全绽放。如果您希望在未来添加大量功能,我几乎肯定会编写与老家伙完全不同的代码。也许重构对于s/w engineering 来说是一个合适的问题。在这里,这将是题外话。

标签: c# linq dynamic


【解决方案1】:

是的,您可以通过反射来做到这一点,但需要一些工作才能将其转化为易于使用的格式,因此可能不推荐使用。

See this dotnetfiddle for a quick example I threw together

基本上你可以通过使用typeof(this).GetProperties() 方法获得this 的所有属性。这将为您返回一个 PropertyInfo 对象列表,然后您可以像我在小提琴中所做的那样对其进行迭代。但是,如果this 上还有其他属性,您也将获取这些属性,因此您可以在GetProperties 函数的重载中使用BindingFlags

最后,您最好创建某种容器,该容器具有您期望并想要迭代的属性。或者更好的是,您可能只需要接受您将要做很多FirstOrDefaults,这是一条更安全的路线。反射可能很棘手且令人困惑

如有任何问题,请随时提出,我很乐意提供更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2018-08-23
    • 2013-01-15
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多