С точки зрения дизайна, я считаю неправильным требовать статического члена реализации ... Относительное различие между производительностью и использованием памяти между статическими и не для строки примера минимально. Кроме того, я понимаю, что при реализации рассматриваемый объект может иметь значительно больший отпечаток ...
Основная проблема заключается в том, что попытка настроить модель для поддержки статических членов реализации, которые доступны на базовом или интерфейсном уровне с C #, заключается в том, что наши параметры ограничены ... На уровне интерфейса доступны только свойства и методы.
Следующая проблема разработки заключается в том, будет ли код базироваться или зависит от реализации. С реализацией ваша модель получит некоторое подтверждение во время компиляции в коде необходимости включать подобную логику во все реализации. С базой ваша оценка произойдет во время выполнения, но логика будет централизована в одном месте. К сожалению, данный пример является идеальным примером для реализации кода, специфичного для реализации, поскольку логика, связанная с данными, отсутствует.
Итак, в качестве примера, давайте предположим, что есть некоторая фактическая логика, связанная с данными, и что она достаточно обширна и / или достаточно сложна, чтобы обеспечить витрину для базовой классификации. Если оставить в стороне, использует ли логика базового класса какие-либо детали имплементации или нет, у нас есть проблема обеспечения статической инициализации реализации. Я бы рекомендовал использовать защищенный реферат в базовом классе, чтобы заставить все реализации создавать необходимые статические данные, которые будут проверяться во время компиляции. Все IDE, с которыми я работаю, делают это очень быстро и легко. Для Visual Studio требуется всего несколько щелчков мышью, а затем просто существенно изменить возвращаемое значение.
Возвращаясь к весьма специфической природе вопроса и игнорируя многие другие проблемы проектирования ... Если вы действительно должны придерживаться всего этого характера статических данных и все же применять их в рамках характера проблемы .. Определенно используйте метод над свойствами, поскольку существует множество побочных эффектов, позволяющих использовать свойства. Используйте статический член в базовом классе и используйте статический конструктор в реализациях, чтобы установить имя. Теперь имейте в виду, что вы должны проверять имя во время выполнения, а не во время компиляции. По сути, метод GetName в базовом классе должен обрабатывать то, что происходит, когда реализация не устанавливает свое имя. Это может привести к исключению, из-за которого становится совершенно очевидно, что что-то не так с реализацией, которая была вызвана надеждой при тестировании / QA, а не у пользователя. Или вы можете использовать рефлексию, чтобы получить имя реализации и попытаться сгенерировать имя ... Проблема с рефлексией заключается в том, что она может влиять на подклассы и создавать ситуацию с кодом, которую трудно понять и поддерживать разработчику младшего уровня. ..
В этом отношении вы всегда можете сгенерировать имя из имени класса через отражение ... Хотя в долгосрочной перспективе это может быть кошмаром для обслуживания ... Это, однако, уменьшит объем кода, необходимый для реализаций, что кажется более важным, чем любые другие проблемы. Здесь вы также можете использовать атрибуты, но затем вы добавляете в реализации код, который эквивалентен по времени / усилию как статический конструктор, и у вас все еще остается проблема, что делать, если реализация не включает эту информацию.