C# 如何修改列表中存储的对象的值

C# 如何修改列表中存储的对象的值,c#,sql,asp.net,list,dictionary,C#,Sql,Asp.net,List,Dictionary,我有一个类,它在循环的每次迭代开始时被实例化。在循环内部,它的属性需要由存储过程返回的表的行值填充。由于我必须遍历每一行的每一列,为了知道类的哪个属性需要赋值以及何时赋值,我有一个将列名映射到索引的字典。此索引是指列表中存储类实例属性的位置: while (reader.Read() && reader.HasRows) { Subscription subscription = new Subscription(); List<string> sub

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

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;
        }
    }
while(reader.Read()&&reader.HasRows)
{
订阅=新订阅();
List subscrData=新列表
{
订阅号1,
第2.2节,
2.3,
订阅1.4
}
Dictionary columnDict=新字典
{
{“attr1”:0},
{“attr2”:1},
{“attr3”:2},
{“attr4”:3}
}
foreach(columnDict.Keys中的字符串colName)
{
if(reader.GetSchemaTable().Columns[colName]==null)
subscrData[columnDict[colName]]=“空”;
其他的
{
subscrData[columnDict[colName]]=reader[colName].ToString();
nullsReturned=false;
}
}

我可能是从C++的方法来的,因为你可以将引用存储到类实例中,修改它的属性,但是这不适用于C,因为列表存储了值。


如何重新构造此代码,以便修改类实例的实际属性,同时仍然能够检查从存储过程返回的每一列是否不为null?对于这种情况,您不需要列表。您可以向类中添加类似setAttribute(string attributeName)的方法(并在其中构建一个switch/case来修改给定属性);或者,使用反射来更改给定名称的实例字段。

此案例不需要列表。您可以向类中添加一个类似setAttribute(string attributeName)的方法(并在其中构建一个switch/case来修改给定属性);或者,使用反射更改给定名称的实例字段。

我同意Hasan的观点。但仅供参考:为了实现您的方法,您可以使用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);
Subscription=新订阅();
List subscrData=新列表
{
a=>a.attr1,
a=>a.attr2,
a=>a.attr3,
a=>a.attr4,
};
//例如,要更新属性3,可以执行以下操作:
var prop=(PropertyInfo)((MemberExpression)subscrData[2].Body).Member;
prop.SetValue(订阅,“测试字符串”,null);

我同意哈桑的观点。但仅供参考:为了实现您的方法,您可以使用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);
Subscription=新订阅();
List subscrData=新列表
{
a=>a.attr1,
a=>a.attr2,
a=>a.attr3,
a=>a.attr4,
};
//例如,要更新属性3,可以执行以下操作:
var prop=(PropertyInfo)((MemberExpression)subscrData[2].Body).Member;
prop.SetValue(订阅,“测试字符串”,null);