当对象变量名称在另一个变量中时,为对象变量赋值

我有一个这样的课:

Class A { int a; string b; ..... ..... ......//up to 200 } 

我需要从变量中设置a或b的值,例如:

 var varValue; 

因此,变量varValue伴随着另一个变量:

 string varName='a'; 

所以,我需要创建一个对象并赋值,这样如果varName是’a’,则相应的varValue被赋值给int a; 如果varName是’b’,反之亦然

我需要这个,因为我有一个服务只返回属性名称及其对应的值作为元组,我需要将它放在一个模型中,但元组可能以任何顺序进行,我需要正确地将值赋值给对象。

而且我不想使用if-else因为我class上有大约200个变量。

有几种不同的方法来实现这样的东西,但它们都有它们的缺点。 正如评论者提到的那样。 拥有200个不同的命名变量是糟糕的设计,即使不知道软件的确切要求,它几乎可以肯定地写得更好。

  1. 使用字典

不要将数据存储为单独的变量,而是使用Dictionary作为数据容器,键入名称:

 Dictionary myVariables = new Dictionary 

现在你可以使用:

 Tuple myResult = new Tuple(varName, myVariables[varName]); 

这会丢失类型安全性,但从您的示例中可以看出,您已经返回了任意数量的不同类型(int,string)作为通用“varValue”实例的一部分。 另外,不要忘记添加错误检查 - 使用myVariables.TryGetValue安全地获取值,或者在访问之前检查myVariables.ContainsKey

  1. reflection

使用reflection,您可以检索名称仅在运行时已知的变量的值:

 object varValue = this.GetType() .GetField(varName, BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(this); 

现在你可以再次基于varName和varValue返回元组。 同样,与Dictionary方法一样,您必须小心并确保在返回之前validation所请求的varName是否存在并具有值。

此外,通过reflection使用除其名称之外的任何内容返回值是潜在的安全风险,允许任何调用者请求任何私有值。 当然,如果调用者直接调用您的代码,它可以通过reflection访问您的值。 但如果将其作为远程服务的一部分公开,它(理论上)可以允许访问意外数据。

  1. 重新设计

但实际上,这两种方法都只是针对糟糕设计的创可贴。 如果您可以重构您的课程,以便数据不会随意存储,那么最好这样做。 但是在不知道用例的情况下,很难推荐任何特定的东西。