当对象变量名称在另一个变量中时,为对象变量赋值
我有一个这样的课:
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个不同的命名变量是糟糕的设计,即使不知道软件的确切要求,它几乎可以肯定地写得更好。
- 使用字典
不要将数据存储为单独的变量,而是使用Dictionary作为数据容器,键入名称:
Dictionary myVariables = new Dictionary
现在你可以使用:
Tuple myResult = new Tuple(varName, myVariables[varName]);
这会丢失类型安全性,但从您的示例中可以看出,您已经返回了任意数量的不同类型(int,string)作为通用“varValue”实例的一部分。 另外,不要忘记添加错误检查 - 使用myVariables.TryGetValue
安全地获取值,或者在访问之前检查myVariables.ContainsKey
。
- reflection
使用reflection,您可以检索名称仅在运行时已知的变量的值:
object varValue = this.GetType() .GetField(varName, BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(this);
现在你可以再次基于varName和varValue返回元组。 同样,与Dictionary方法一样,您必须小心并确保在返回之前validation所请求的varName是否存在并具有值。
此外,通过reflection使用除其名称之外的任何内容返回值是潜在的安全风险,允许任何调用者请求任何私有值。 当然,如果调用者直接调用您的代码,它可以通过reflection访问您的值。 但如果将其作为远程服务的一部分公开,它(理论上)可以允许访问意外数据。
- 重新设计
但实际上,这两种方法都只是针对糟糕设计的创可贴。 如果您可以重构您的课程,以便数据不会随意存储,那么最好这样做。 但是在不知道用例的情况下,很难推荐任何特定的东西。