C# 动态Linq FirstOrDefault语句

C# 动态Linq FirstOrDefault语句,c#,linq,dynamic,C#,Linq,Dynamic,使用C#7+,我通过FirstOrDefault()语句实例化一个变量。但是它在不同变量的代码中重复出现。我想知道是否/如何动态构建这些语句。这就是我目前拥有的(请注意,变量名与DataTable名匹配) 我想做的是给出一个字符串列表,迭代地创建这些变量中的每一个。比如: foreach(var item in list) { var somename = this."item".FirstOrDefault(); } 这是可能的吗?是的,您可以使用反射来实现这一点,但需要做一些工作才

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

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

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

这是可能的吗?

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

基本上,您可以使用
typeof(this).GetProperties()
方法获取
this
的所有属性。这将返回一个
PropertyInfo
对象列表,您可以像我在小提琴中做的那样迭代这些对象。但是,如果
上有任何其他属性,您也将获取这些属性,以便可以在函数重载中使用

最后,您最好创建某种容器,该容器具有您期望并希望迭代的属性。或者更好的是,您可能只需要接受这样一个事实:您将首先执行许多
或defaults
,这是一个更安全的方法。反射可能会很棘手和令人困惑


请随时提出任何问题,我很乐意详细介绍

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

基本上,您可以使用
typeof(this).GetProperties()
方法获取
this
的所有属性。这将返回一个
PropertyInfo
对象列表,您可以像我在小提琴中做的那样迭代这些对象。但是,如果
上有任何其他属性,您也将获取这些属性,以便可以在函数重载中使用

最后,您最好创建某种容器,该容器具有您期望并希望迭代的属性。或者更好的是,您可能只需要接受这样一个事实:您将首先执行许多
或defaults
,这是一个更安全的方法。反射可能会很棘手和令人困惑


请随便问任何问题,我很乐意深入了解更多细节

您可以使用reflection
System.reflection.FieldInfo
获取字段,但如何在
foreach
循环中创建变量?Local,设计为作为参数值传递给某些存储过程。我有DBA的背景,开始使用这些类型变量赋值的100行代码——特别是var nameofthing=this.nameofthing.FirstOrDefault()。由于这种具体的模式,似乎必须有一种更好的方式通过编程来实现这一点(我可能错了!)“更好”是主观的。MickelsonMichael提到了反射,是的,你可以这样做,但正如我喜欢说的,“反射是疯狂的科学。”你不再为目标编程;你在为目标编程[sic]。换句话说,这是元编程。代码的意图可能会丢失,从而降低可维护性。坦率地说,试图简化这个模式可能不是你能量的最佳利用。这似乎是一个错误。也许有了更多的信息,你会得到更多有用的答案。例如,
GeneralSolution
PieceModel
的类型是什么?想一想,当你不知道这些变量的名字甚至不知道它们的存在时,你希望如何编写代码来使用它们?你似乎从一个疯子甚至可能是一个承包商那里继承了代码,但如果代码工作可靠,你最好还是保持原样。另一种选择是对其进行全面重构,而不仅仅是清理那些奇怪的习语,同时让本质上的恐惧充分爆发。如果您希望在将来添加大量功能,我几乎肯定会编写与老家伙完全不同的代码。也许重构对我们来说是一个合适的问题。在这里,这可能与主题无关。您可以使用reflection
System.reflection.FieldInfo
获取字段,但如何在
foreach
循环中创建变量?Local,设计为作为参数值传递给某些存储过程。我有DBA的背景,开始使用这些类型变量赋值的100行代码——特别是var nameofthing=this.nameofthing.FirstOrDefault()。由于这种具体的模式,似乎必须有一种更好的方式通过编程来实现这一点(我可能错了!)“更好”是主观的。MickelsonMichael提到了反射,是的,你可以这样做,但正如我喜欢说的,“反射是疯狂的科学。”你不再为目标编程;你在为目标编程[sic]。换句话说,这是元编程。代码的意图可能会丢失,从而降低可维护性。坦率地说,试图简化这个模式可能不是你能量的最佳利用。这似乎是一个错误。也许有了更多的信息,你会得到更多有用的答案。例如,
GeneralSolution
PieceModel
的类型是什么?想一想,当你不知道这些变量的名字甚至不知道它们的存在时,你希望如何编写代码来使用它们?你似乎从一个疯子甚至可能是一个承包商那里继承了代码,但如果代码工作可靠,你最好还是保持原样。另一种选择是对其进行全面重构,而不仅仅是清理那些奇怪的习语,同时让本质上的恐惧充分爆发。如果您希望在将来添加大量功能,我几乎肯定会编写与老家伙完全不同的代码。也许重构是一个合适的问题
foreach(var item in list)
{
    var somename = this."item".FirstOrDefault();
}