Ho un numero di classi che riflettono le tabelle in un database. Mi piacerebbe avere una classe base che abbia alcune funzionalità di base (diciamo, avrebbe un flag "isDirty") e una matrice statica di stringhe con i nomi delle colonne così come appaiono nel database. Il seguente codice non funziona, ma illustra quello che vorrei fare:Elemento ereditario membro statico in C#
public class BaseRecord {
public bool isDirty;
public object [] itemArray;
public static string [] columnNames;
}
public class PeopleRec : BaseRecord {
}
public class OrderRec : BaseRecord {
}
public static void Main() {
PeopleRec.columnNames = new string[2];
PeopleRec.columnNames[0]="FIRST_NAME";
PeopleRec.columnNames[1]="LAST_NAME";
OrderRec.columnNames = new string[4];
OrderRec.columnNames[0] = "ORDER_ID";
OrderRec.columnNames[1] = "LINE";
OrderRec.columnNames[2] = "PART_NO";
OrderRec.columnNames[3] = "QTY";
}
public class DoWork<T> where T : BaseRecord {
public void DisplayColumnNames() {
foreach(string s in T.columnNames)
Console.Write("{0}", s);
}
public void DisplayItem(T t) {
for (int i=0; i<itemValues.Length; i++) {
Console.Write("{0}: {1}",t.columnNames[i],t.itemValues[i])
}
}
}
Vorrei ciascuna classe derivata di avere un proprio array statico di stringhe di nomi di colonna di database, e vorrei che la classe generica per accedi a questo membro statico senza bisogno di un'istanza.
Ma non funziona:
(A) columnNames è l'array identico in BaseRec, PeopleRec e OrderRec. Non posso avere columnNames essere diverso. BaseRec.columnNames.Length sarebbe 3 perché il columnNames in OrderRec è inizializzato per ultimo.
(B) La notazione T.columnNames non viene compilata.
Qualche idea su come risolvere questo problema?
Grazie Dave. Ho considerato l'utilizzo di un dizionario come ultima risorsa (semplicemente a causa del piccolo sovraccarico di prestazioni extra), ma non ho pensato di utilizzare il tipoof (T) come campo chiave. La tua soluzione è sicuramente elegante. –
Grazie mille. La mia soluzione utilizza Attributi sulle classi, ma è dolorosamente lenta se devi colpirla ripetutamente (a causa del riflesso) ... Potrei passare a questo se finisco per averne bisogno. – Crisfole