Tengo varias clases que reflejan tablas en una base de datos. Me gustaría tener una clase base que tenga alguna funcionalidad básica (por ejemplo, que tenga un indicador "isDirty") y una matriz estática de cadenas con los nombres de las columnas tal como aparecen en la base de datos. El código siguiente no funciona, pero ilustra lo que me gustaría hacer:Herencia de miembros estáticos en 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])
}
}
}
Me gustaría que cada clase derivada a tener su propia matriz estática de cadenas de nombres de columna de base de datos, y me gustaría que la clase genérica de acceda a este miembro estático sin la necesidad de una instancia.
Pero no funciona:
(A) columnNames es la matriz idéntica en BaseRec, PeopleRec y OrderRec. No puedo hacer que columnNames sea diferente. BaseRec.columnNames.Length sería 3 porque columnNames en OrderRec se inicializa al final.
(B) La notación T.columnNames no compila.
¿Alguna idea sobre cómo solucionar esto?
Gracias Dave. Consideré usar un diccionario como último recurso (simplemente debido a la pequeña sobrecarga de rendimiento adicional), pero no pensé en usar el tipo de letra (T) como campo clave. Su solución ciertamente es elegante. –
Muchas gracias. Mi solución usa Atributos en las clases, pero es muy lento si necesitas golpearla repetidamente (debido a la reflexión) ... Podría cambiar a esto si llego a necesitar esto mucho. – Crisfole