【问题标题】:How to modify values of an object stored in a list如何修改存储在列表中的对象的值
【发布时间】:2017-10-03 20:04:16
【问题描述】:

我有一个在循环的每次迭代开始时实例化的类。在循环内部,它的属性需要填充存储过程返回的表的行值。因为我必须遍历每一行的每一列,为了知道类的哪个属性需要赋值以及何时赋值,我有一个字典,将列名映射到索引。该索引指的是列表中存储类实例属性的位置:

while (reader.Read() && reader.HasRows)
{
    Subscription subscription = new Subscription();
    List<string> subscrData = new List<string>
    {
        subscription.attr1, 
        subscription.attr2, 
        subscription.attr3, 
        subscription.attr4
    }


    Dictionary<string, int> columnDict = new Dictionary<string, int>
    {
        {"attr1": 0},
        {"attr2":1},
        {"attr3":2},
        {"attr4":3}
    }

    foreach (string colName in columnDict.Keys)
    {
        if (reader.GetSchemaTable().Columns[colName] == null)
            subscrData[columnDict[colName]] = "null";
        else
        {
            subscrData[columnDict[colName]] = reader[colName].ToString();
            nullsReturned = false;
        }
    }

我可能更多地来自 C++ 方法,因为您可以存储对类实例的引用并修改其属性,但这不适用于 C#,因为列表存储值。

如何重构此代码,以便修改类实例的实际属性,同时仍能够检查从存储过程返回的每一列是否不为空?

【问题讨论】:

    标签: c# sql asp.net list dictionary


    【解决方案1】:

    您不需要此案例的列表。您要么想将 setAttribute(string attributeName) 之类的方法添加到您的类中(并在其中构建一个开关/案例来修改给定的属性);或者,使用反射来更改给定名称的实例字段。

    【讨论】:

      【解决方案2】:

      我同意哈桑的观点。但仅供参考:要实现您的方法,您可以使用 Lambda 表达式来跟踪对您的属性(= 属性)的引用。

      这样的事情会起作用:

      Subscription subscription = new Subscription(); 
      List<Expression<Func<Subscription, string>>> subscrData = new List<Expression<Func<Subscription, string>>>
      {
          a => a.attr1,
          a => a.attr2,
          a => a.attr3,
          a => a.attr4,
      };
      
      //E.g. To update attribute 3 you can do this:            
      var prop = (PropertyInfo)((MemberExpression)subscrData[2].Body).Member;
      prop.SetValue(subscription, "test string", null);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 2020-03-17
        • 1970-01-01
        • 2020-09-30
        • 2019-02-01
        相关资源
        最近更新 更多