Qual è il modo migliore per definire una proprietà statica che viene definita una volta per sottoclasse?

Qual è il modo migliore per definire una proprietà statica che viene definita una volta per sottoclasse?

Due possibili approcci:

  • Usa gli attributi; decorare ogni sottoclasse con un attributo, ad es.

    [MyProperty(5)]
    public class DerivedAlpha
    {
    }
    
    [MyProperty(10)]
    public class DerivedBeta
    {
    }
    

    Funziona solo quando sono effettivamente costanti, ovviamente.

  • Usa un dizionario:

    var properties = new Dictionary<Type, int>
    {
        { typeof(DerivedAlpha), 5) },
        { typeof(DerivedBeta), 10) },
    };
    

EDIT:ora che abbiamo più contesto, la risposta di Ben è davvero buona, usando il modo in cui funzionano i generici in C#. È come l'esempio del dizionario, ma con pigrizia, thread-safety e semplice accesso globale sono tutti integrati.


Jon ha una buona soluzione come al solito, anche se non vedo cosa fanno gli attributi buoni qui, dal momento che devono essere aggiunti esplicitamente a ogni sottotipo e non agiscono come proprietà.

Il Dictionary approccio può sicuramente funzionare. Ecco un altro modo per farlo, che dichiara esplicitamente che ci sarà una variabile per sottoclasse di BaseEntity :

class FilteredProperties<T> where T : BaseEntity
{
     static public List<string> Values { get; private set; }
     // or static public readonly List<string> Values = new List<string>();
     static FilteredProperties()
     {
         // logic to populate the list goes here
     }
}

Lo svantaggio è che è piuttosto difficile accoppiare un GetType() chiamata come potresti usare nei metodi di BaseEntity . Un Dictionary , o il relativo wrapper che implementa la popolazione pigra, è migliore per quell'uso.