Static member inheritance in C#

c#, inheritance, static

Solution

The issue is you that you want to associate some data with the types, not with instances of the types. I'm not sure that there's a neat way of doing this in C#, but one possibility is using a static `Dictionary<Type, string[]>` on `BaseRecord`. An example is below, you could neaten this up by adding some generic static members on `BaseRecord` for initializing/accessing the record names (and add some error checking...):

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);
        }
    }
}

Problem

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: ``` 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]) } } } ``` 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. But it doesn't work: (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. (B) The notation T.columnNames does not compile. Any ideas on how to fix this?

Original source

Related problems