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

时间:2015-01-16 11:14:37

标签: c#

我有一个类似的课程:

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个变量。

1 个答案:

答案 0 :(得分:4)

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

  1. 使用字典
  2. 不要将数据存储为单独的变量,而是使用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

    1. 反射
    2. 使用反射,您可以检索名称仅在运行时已知的变量的值:

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

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

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

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