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