C#中的静态成员继承

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不编译.

有想法该怎么解决这个吗?

Dav*_*ave 3

问题是您希望将某些数据与类型相关联,而不是与类型的实例相关联。我不确定在 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)