Ich habe eine Anzahl von Klassen, die Tabellen in einer Datenbank widerspiegeln. Ich möchte eine Basisklasse haben, die einige grundlegende Funktionalität hat (sagen wir, es hätte ein "isDirty" -Flag) und ein statisches Array von Strings mit den Spaltennamen, wie sie in der Datenbank erscheinen. Der folgende Code funktioniert nicht, sondern zeigt, was ich tun möchte:Statische Membervererbung 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])
}
}
}
würde ich jede abgeleitete Klasse wie seine eigene statische Array von Strings von Datenbankspaltennamen haben, und ich würde die generische Klasse gerne Greifen Sie auf dieses statische Element zu, ohne eine Instanz zu benötigen.
Aber es funktioniert nicht:
(A) columnNames ist das identische Array in BaseRec, PeopleRec und OrderRec. Ich kann columnNames nicht anders haben. BaseRec.columnNames.Length wäre 3, weil die columnNames in OrderRec zuletzt initialisiert wurden.
(B) Die Notation T.columnNames kompiliert nicht.
Irgendwelche Ideen, wie Sie das beheben können?
Danke Dave. Ich überlegte, ob ich ein Dictionary als letzten Ausweg verwenden sollte (einfach aufgrund des geringen zusätzlichen Leistungsaufwands), aber ich dachte nicht daran, den Typ (T) als Schlüsselfeld zu verwenden. Ihre Lösung ist sicherlich elegant. –
Vielen Dank. Meine Lösung verwendet Attribute für die Klassen, aber es ist schmerzhaft langsam, wenn Sie es wiederholt treffen müssen (wegen der Reflektion) ... Ich könnte zu diesem wechseln, wenn ich es brauche, was sehr viel kostet. – Crisfole