У меня есть общедоступное статическое свойство в классе. Класс имеет некоторые пользовательские атрибуты, применяемые к нему. Я хочу получить доступ к атрибуту в статическом свойстве.
В нестационарном члене я могу получить тип текущего класса, используя this.GetType(), но как это сделать в статическом члене класса?
Обратите внимание, что..
Я не хочу использовать typeof (typename) из-за к вопросам наследования. [У меня будет это свойство, унаследованное от производного классы.].
Я также не хочу использовать Generics как хорошо.
Здесь моя цель.
У меня есть абстрактный базовый класс EntityBase. Все мои сущности происходят из этого класса. Каждый объект также несет пользовательский атрибут, называемый TableMappingAttribute, который позволяет мне знать таблицу, к которой она относится/карты, во время выполнения. У меня уже есть свойство в EntityBase, которое возвращает мне сопоставленное TableName для объекта.
Мне всегда понадобится экземпляр объекта для доступа к свойству TableName. Я хочу получить доступ к этому свойству статически когда-нибудь, например MyEntity.TableName. У меня есть большие объекты в моем проекте. Я хочу, чтобы это статическое свойство было добавлено в сам класс EntityBase. Поэтому я должен обнаружить тип во время выполнения. Как это сделать в самом классе EntityBase?
Thnaks.
Вы не можете, в принципе. typeof (...) - это то, что вам нужно использовать.
Имейте в виду, что если вы попытаетесь использовать:
Type type = MyDerivedType.SomeStaticProperty;
который объявлен в MyBaseType
, который на самом деле будет скомпилирован для
Type type = MyBaseType.SomeStaticProperty;
в любом случае. Статические элементы в основном не являются полиморфными. Если вы попытаетесь использовать их полиморфно, вы столкнетесь с такими проблемами.
ИЗМЕНИТЬ: Итак, из вашего редактирования, похоже, вы пытаетесь сделать именно этот тип вещей,
MyEntity.TableName
вместо
EntityBase.TableName
Это просто не сработает. Компилятор выдает код для извлечения EntityBase.TableName. В среде исполнения нет понятия "текущий класс". Здесь нет никакого контекста.
В принципе вам нужно изменить свой дизайн. Если вы хотите использовать наследование, вы можете захотеть иметь параллельную иерархию - одну для метаданных (например, имена таблиц) и одну для реальных объектов. Таким образом, у вас будет что-то вроде:
public class MyEntity : EntityBase<MyEntityType>
где MyEntityType происходит от EntityType в параллельной иерархии. Затем вы можете использовать наследование в иерархии метаданных.
В качестве альтернативы просто создание EntityBase generic в любом случае позволит вам получить тип сущности, о которой вы говорите:
public class MyEntity : EntityBase<MyEntity>
Я знаю, что вы сказали, что не хотите использовать дженерики, но поскольку то, что вы хотите сделать, просто не сработает, вы должны хотя бы рассмотреть его...
Я не хочу использовать typeof (typename) из-за проблем с наследованием.
статические свойства не наследуются в нормальном смысле. Несомненно, они в области, но это не то же самое. Единственный способ получить то, что вы хотите, - это посмотреть на стек-фрейм, но это уродливое и взломанное (и опасно, если оптимизация включена).
Я бы рефакторинг для решения, которое использует экземпляр instace..., имеет Type
.
Вам не нужно беспокоиться о наследовании, если свойство static
; он не может быть переопределен, поэтому он всегда будет объявлен в базовом классе. Использование typeof
- путь.
Если вы не хотите использовать typeof(), вам не повезло, потому что это единственный способ получить объект Type из статического класса (если вы не хотите найти тип, вызвав Type.GetType() и найдите его по имени)
Я не вижу проблемы с наследованием.
Type type = typeof(YourStaticClass);
Attribute[] attributes = type.GetCustomAttributes(...);
Вы можете использовать класс System.Diagnostics.StackFrame
в статическом методе, подобном этому:
StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
Родитель не знает, сколько у него детей. Но ребенок знает о своем родителе. Единственный способ, которым родитель должен знать о ребенке, - это полиморфизм, который не является атрибутом статических членов.
То, что вы пытаетесь сделать, - это знать о дочернем классе в общедоступном статическом свойстве родителя. Почему бы вам не рассмотреть отправку ссылки на дочерний класс в качестве параметра в статическом методе в базовом классе, а затем в базовом классе есть ссылка на дочерний класс, вызвав его метод GetType...
public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
Type type = childsObjectWrappedInBaseReference.GetType();
....
....
}