Каков наилучший способ определить статическое свойство, которое определяется один раз для каждого подкласса?

Я написал следующее консольное приложение для проверки статических свойств:

using System;

namespace StaticPropertyTest
{
    public abstract class BaseClass
    {
        public static int MyProperty { get; set; }
    }

    public class DerivedAlpha : BaseClass
    {
    }

    public class DerivedBeta : BaseClass
    {
    }

    class Program
    {
        static void Main(string[] args)
        {
            DerivedBeta.MyProperty = 7;
            Console.WriteLine(DerivedAlpha.MyProperty); // outputs 7
        }
    }
}

Как показывает это консольное приложение,MyProperty свойство существует один раз для всех экземпляров BaseClass. Есть ли шаблон для использования, который позволил бы мне определить статическое свойство, которое будет выделять память для каждого типа подкласса?

Учитывая приведенный выше пример, я хотел бы, чтобы все случаиDerivedAlpha совместно использовать одно и то же статическое свойство и все экземплярыDerivedBeta делитьсяеще один экземпляр статического свойства.

Почему я пытаюсь это сделать?

Я лениво инициализирую коллекцию имен свойств класса с определенными атрибутами (через отражение). Имена свойств будут идентичны для каждого экземпляра производного класса, поэтому хранить его в каждом экземпляре класса представляется расточительным. Я не могу сделать его статическим в базовом классе, потому что разные подклассы будут иметь разные свойства.

Я не хочу копировать код, который заполняет коллекцию (посредством отражения) в каждом производном классе. Я знаю, что одним из возможных решений является определение метода для заполнения коллекции в базовом классе и вызов его из каждого производного класса, но это не самое элегантное решение.

Обновление - пример того, что я делаю

По просьбе Джона, вот пример того, что я пытаюсь сделать. По сути, я могу при желании украсить свойства в своих классах[SalesRelationship(SalesRelationshipRule.DoNotInclude)] атрибут (есть другие атрибуты, это просто упрощенный пример).

public class BaseEntity
{
    // I want this property to be static but exist once per derived class.
    public List<string> PropertiesWithDoNotInclude { get; set; }

    public BaseEntity()
    {
        // Code here will populate PropertiesWithDoNotInclude with
        // all properties in class marked with
        // SalesRelationshipRule.DoNotInclude.
        //
        // I want this code to populate this property to run once per
        // derived class type, and be stored statically but per class type.
    }
}

public class FooEntity : BaseEntity
{
   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_A { get; set; }

   public int? Property_B { get; set; }

   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_C { get; set; }
}

public class BarEntity : BaseEntity
{
   public int? Property_D { get; set; }

   [SalesRelationship(SalesRelationshipRule.DoNotInclude)]
   public int? Property_E { get; set; }

   public int? Property_F { get; set; }
}

Желаемый конечный результат

Доступ кFooEntity.PropertiesWithDoNotInclude возвращаетList<string> из:

{
  "Property_A",
  "Property_C"
}

Доступ кBarEntity.PropertiesWithDoNotInclude возвращаетList<string> из:

{
  "Property_E"
}

Ответы на вопрос(3)

Ваш ответ на вопрос