【发布时间】: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。也许有了更多信息,您会得到更多有用的答案。比如
GeneralSolution或PieceModel的类型有哪些?想想当您不知道变量的名称甚至不知道它们存在时,您会如何编写代码来使用这些变量? -
您似乎从疯子甚至可能是承包商那里继承了代码,但如果代码工作可靠,您最好保留它。另一种选择是完全重构它,而不是仅仅清理奇怪的习语,同时让本质的恐怖完全绽放。如果您希望在未来添加大量功能,我几乎肯定会编写与老家伙完全不同的代码。也许重构对于s/w engineering 来说是一个合适的问题。在这里,这将是题外话。