Mar*_*ton 6 c# inheritance static
我有许多反映数据库中表的类.我想有一个基类具有一些基本功能(比如,它将有一个"isDirty"标志),以及一个字符串的静态数组,其列名出现在数据库中.以下代码不起作用,但说明了我想要做的事情:
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])
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望每个派生类都有自己的数据库列名字符串的静态数组,我希望泛型类能够访问这个静态成员,而不需要实例.
但它不起作用:
(A)columnNames是BaseRec,PeopleRec和OrderRec中的相同数组.我不能让columnNames有所不同.BaseRec.columnNames.Length将为3,因为OrderRec中的columnNames最后被初始化.
(B)符号T.columnNames不编译.
有想法该怎么解决这个吗?
问题是您希望将某些数据与类型相关联,而不是与类型的实例相关联。我不确定在 C# 中是否有一种巧妙的方法来执行此操作,但一种可能性是Dictionary<Type, string[]>在BaseRecord. BaseRecord下面是一个示例,您可以通过添加一些通用静态成员来初始化/访问记录名称(并添加一些错误检查...)来整理它:
using System;
using System.Collections.Generic;
namespace Records
{
public class BaseRecord
{
public bool isDirty;
public object[] itemArray;
public static Dictionary<Type, string[]> columnNames = new Dictionary<Type, string[]>();
}
public class PeopleRec : BaseRecord
{
static PeopleRec()
{
string[] names = new string[2];
names[0] = "FIRST_NAME";
names[1] = "LAST_NAME";
BaseRecord.columnNames[typeof(PeopleRec)] = names;
}
}
public class DoWork<T> where T : BaseRecord
{
public void DisplayColumnNames()
{
foreach (string s in BaseRecord.columnNames[typeof(T)])
Console.WriteLine("{0}", s);
}
public void DisplayItem(T t)
{
for (int i = 0; i < t.itemArray.Length; i++)
{
Console.WriteLine("{0}: {1}", BaseRecord.columnNames[typeof(T)][i], t.itemArray[i]);
}
}
}
class Program
{
public static void Main()
{
PeopleRec p = new PeopleRec
{
itemArray = new object[] { "Joe", "Random" }
};
DoWork<PeopleRec> w = new DoWork<PeopleRec>();
w.DisplayColumnNames();
w.DisplayItem(p);
}
}
}
Run Code Online (Sandbox Code Playgroud)