2011-11-16 21 views
62

Attualmente sto impostando tutti i valori del mio oggetto classe Record.C# Iterate attraverso le proprietà della classe

Questo è il codice che sto utilizzando per compilare il record al momento, proprietà per proprietà.

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

Posso scorrere ciascuna delle proprietà in modo dinamico senza codifica duro tutti i nomi di proprietà?

Qualcosa in questo modo:

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

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

Hai provato Reflection? http://stackoverflow.com/questions/997747/c-sharp-reflection-accessing-the-fields-of-a-struct – kol

+1

pls dai un'occhiata a questo link http://stackoverflow.com/questions/721441/c -sharp-how-to-iterate-through-classes-fields-and-set-properties –

+0

Puoi spiegare dove e come vorrai mantenere la relazione tra una proprietà e l'indice nella matrice resultItems? –

risposta

140

Si potrebbe utilizzare la riflessione per fare questo. Per quanto ho capito, è possibile enumerare le proprietà della classe e impostare i valori. Dovresti provare questo e assicurarti di aver compreso l'ordine delle proprietà. Fare riferimento a questo MSDN Documentation per ulteriori informazioni su questo approccio.

per un suggerimento, si potrebbe fare qualcosa di simile:

Record record = new Record(); 

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

Dove value è il valore hai intenzione di scrivere in (quindi dal resultItems array).

+0

Cosa succede se voglio usare * property.Getvalue (someOtherClassObjectHavingExacltySameProperties) * invece di un *valore*? (Ho provato questa ** proprietà? .SetValue (objAppointment, property.GetValue (temp)); ** ma mi dà, ** {"L'oggetto non corrisponde al tipo di destinazione."} **) –

+0

@MalikAsif I'm non sono sicuro di averlo compreso appieno, ma sembra che tu stia cercando di caricare una proprietà da un tipo diverso. Se pubblichi una domanda su SO con un esempio e la colleghi qui, ti darò un'occhiata. –

12
// 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]); 
} 
+0

Questo sembra buono, ma speravo di farlo dinamicamente, piuttosto che codificare i nomi dei campi. È possibile? Grazie – Luke

+0

Sembra anche che la proprietà 'GetProperty' non sia disponibile per la mia istanza di classe. :/ – Luke

+0

no, deve esserci una mappatura da qualche parte tra gli indici resultItem e i nomi delle proprietà. – jgauffin

1

Sì, è possibile creare un indicizzatore nella classe Record che mappa dal nome della proprietà alla proprietà corretta. Ciò mantenere tutti l'associazione dal nome struttura a struttura in un posto ad esempio:

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

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

alternativa, come altri hanno già detto, l'uso riflessione.

Problemi correlati