首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#遍历类属性

C#遍历类属性
EN

Stack Overflow用户
提问于 2011-11-16 20:42:36
回答 3查看 176.9K关注 0票数 142

我目前正在设置我的类对象Record的所有值。

这是我用来逐个属性填充记录的代码。

代码语言:javascript
复制
// Loop through each field in the result set
for (int i = 0; i <= resultItems.Length; i++)
{

    Record newRecord = new Record()
    {
            itemtype =   resultItems[i - (fieldCount - 0)],
            itemdesc =   resultItems[i - (fieldCount - 1)],
            prodcode =   resultItems[i - (fieldCount - 2)],
            proddesc =   resultItems[i - (fieldCount - 3)],
            curstat =    resultItems[i - (fieldCount -4)],
            totfree =    resultItems[i - (fieldCount -5)],
            totphys =    resultItems[i - (fieldCount -6)],
            pcolgroup =  resultItems[i - (fieldCount -7)],
            scolgroup =  resultItems[i - (fieldCount -8)],
            totpo =      resultItems[i - (fieldCount - 9)],
            totso =      resultItems[i - (fieldCount - 10)],
            quality =    resultItems[i - (fieldCount - 11)],
            statusdesc = resultItems[i - (fieldCount - 12)],
            groupcode =  resultItems[i - (fieldCount - 13)],
            qualitydes = resultItems[i - (fieldCount - 14)],
            pcoldesc =   resultItems[i - (fieldCount - 15)],
            scoldesc =   resultItems[i - (fieldCount - 16)],
            pgroupdesc = resultItems[i - (fieldCount - 17)],
    };
}

我是否可以在不对所有属性名称进行硬编码的情况下动态地遍历每个属性?

大概是这样的:

代码语言:javascript
复制
// Create new Record instance
Record newRecord = new Record();

for (int e = 0; e < propertyCount.Length - 1; e++)
{
    newRecord[fieldname] = resultItems[i - (fieldCount - e)];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-16 20:51:34

你可以使用反射来做这件事。据我所知,您可以枚举您的类的属性并设置值。不过,您必须尝试一下,并确保理解属性的顺序。有关此方法的更多信息,请参阅此MSDN Documentation

作为一个提示,您可能会这样做:

代码语言:javascript
复制
Record record = new Record();

PropertyInfo[] properties = typeof(Record).GetProperties();
foreach (PropertyInfo property in properties)
{
    property.SetValue(record, value);
}

其中,value是您想要写入的值(因此从resultItems数组中写入)。

票数 282
EN

Stack Overflow用户

发布于 2011-11-16 20:45:38

代码语言:javascript
复制
// the index of each item in fieldNames must correspond to 
// the correct index in resultItems
var fieldnames = new []{"itemtype", "etc etc "};

for (int e = 0; e < fieldNames.Length - 1; e++)
{
    newRecord
       .GetType()
       .GetProperty(fieldNames[e])
       .SetValue(newRecord, resultItems[e]);
}
票数 19
EN

Stack Overflow用户

发布于 2011-11-16 20:53:52

是的,您可以在您的记录类上创建一个从属性名称映射到正确属性的索引器。这将把所有从属性名到属性的绑定放在一个地方,例如:

代码语言:javascript
复制
public class Record
{
    public string ItemType { get; set; }

    public string this[string propertyName]
    {
        set
        {
            switch (propertyName)
            {
                case "itemType":
                    ItemType = value;
                    break;
                    // etc
            }   
        }
    }
}

或者,正如其他人所提到的,使用反射。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8151888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档