Tôi có một số lớp phản ánh các bảng trong cơ sở dữ liệu. Tôi muốn có một lớp cơ sở có một số chức năng cơ bản (nói, nó sẽ có một lá cờ "isDirty"), và một mảng tĩnh của các chuỗi với các tên cột khi chúng xuất hiện trong cơ sở dữ liệu. Các mã sau đây không làm việc nhưng minh họa những gì tôi muốn làm:Thừa kế thành viên tĩnh trong 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])
}
}
}
Tôi muốn mỗi lớp có nguồn gốc để có nó là mảng tĩnh riêng của chuỗi các tên cột cơ sở dữ liệu, và tôi muốn các lớp tổng quát để truy cập thành viên tĩnh này mà không cần một cá thể.
Nhưng nó không hoạt động:
(A) cộtNames là mảng giống nhau trong BaseRec, PeopleRec và OrderRec. Tôi không thể có columnNames khác nhau. BaseRec.columnNames.Length sẽ là 3 vì columnNames trong OrderRec được khởi tạo lần cuối.
(B) Ký hiệu T.columnNames không biên dịch.
Bất kỳ ý tưởng nào về cách sửa lỗi này?
Cảm ơn Dave. Tôi xem xét việc sử dụng một từ điển như là một phương sách cuối cùng (chỉ đơn giản là do các chi phí hiệu suất trên không), nhưng tôi đã không nghĩ đến việc sử dụng typeof (T) làm trường khóa. Giải pháp của bạn chắc chắn là thanh lịch. –
Cảm ơn rất nhiều. Giải pháp của tôi sử dụng các thuộc tính trên các lớp, nhưng nó rất chậm nếu bạn cần phải nhấn nó nhiều lần (vì sự phản chiếu) ... Tôi có thể chuyển sang điều này nếu tôi cần đến điều này rất nhiều. – Crisfole