title: Static member inheritance in C#
body: <p>I have a number of classes that reflect tables in a database.  I would like to have a base class that has some basic functionality (say, it would have a "isDirty" flag), and a static array of strings with the column names as they appear in the database.  The following code doesn't work but illustrates what I would like to do:</p>
  
  <pre><code>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&lt;T&gt; 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&lt;itemValues.Length; i++) {
        Console.Write("{0}: {1}",t.columnNames[i],t.itemValues[i])
      }
    }
  }
  </code></pre>
  
  <p>I would like each derived class to have it's own static array of strings of database column names, and I would like the generic class to access this static member without the need for an instance.</p>
  
  <p>But it doesn't work:<br>
  (A) columnNames is the identical array in BaseRec, PeopleRec and OrderRec.  I cannot have columnNames be different.  BaseRec.columnNames.Length would be 3 because the columnNames in OrderRec is initialized last.<br>
  (B) The notation T.columnNames does not compile.</p>
  
  <p>Any ideas on how to fix this?</p>