web-dev-qa-db-fra.com

C # Itérer dans les propriétés de classe

Je suis en train de définir toutes les valeurs de mon objet de classe Record.

C’est le code que j’utilise pour peupler l’enregistrement pour le moment, propriété par propriété.

// 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)],
    };
}

Puis-je parcourir dynamiquement chacune des propriétés sans coder en dur tous les noms de propriétés?

Quelque chose comme ça:

// Create new Record instance
Record newRecord = new Record();

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

Vous pouvez éventuellement utiliser Reflection pour le faire. Autant que je sache, vous pouvez énumérer les propriétés de votre classe et définir les valeurs. Vous devrez toutefois essayer ceci et vous assurer de bien comprendre l'ordre des propriétés. Reportez-vous à ceci Documentation MSDN pour plus d'informations sur cette approche.

Pour un indice, vous pouvez éventuellement faire quelque chose comme:

Record record = new Record();

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

value est la valeur que vous voulez écrire (donc de votre tableau resultItems.).

186
Samuel Slade
// 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]);
}
14
jgauffin

Oui, vous pouvez créer un indexeur sur votre classe Record qui mappe du nom de la propriété à la propriété correcte. Cela garderait toutes les liaisons du nom de la propriété à la propriété au même endroit, par exemple:

public class Record
{
    public string ItemType { get; set; }

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

Alternativement, comme d'autres l'ont mentionné, utilisez la réflexion.

1
Rich O'Kelly