Как получить экземпляр System.Type типа класса в Static Member?

2

У меня есть общедоступное статическое свойство в классе. Класс имеет некоторые пользовательские атрибуты, применяемые к нему. Я хочу получить доступ к атрибуту в статическом свойстве.

В нестационарном члене я могу получить тип текущего класса, используя this.GetType(), но как это сделать в статическом члене класса?

Обратите внимание, что..

  • Я не хочу использовать typeof (typename) из-за к вопросам наследования. [У меня будет это свойство, унаследованное от производного классы.].

  • Я также не хочу использовать Generics как хорошо.

ИЗМЕНИТЬ

Здесь моя цель.

У меня есть абстрактный базовый класс EntityBase. Все мои сущности происходят из этого класса. Каждый объект также несет пользовательский атрибут, называемый TableMappingAttribute, который позволяет мне знать таблицу, к которой она относится/карты, во время выполнения. У меня уже есть свойство в EntityBase, которое возвращает мне сопоставленное TableName для объекта.

Мне всегда понадобится экземпляр объекта для доступа к свойству TableName. Я хочу получить доступ к этому свойству статически когда-нибудь, например MyEntity.TableName. У меня есть большие объекты в моем проекте. Я хочу, чтобы это статическое свойство было добавлено в сам класс EntityBase. Поэтому я должен обнаружить тип во время выполнения. Как это сделать в самом классе EntityBase?

Thnaks.

  • 1
    Публичное статическое свойство не будет «наследоваться производным классам» в каком-либо значимом смысле. Что вы на самом деле имеете в виду? Покажите нам код, пожалуйста.
Теги:
reflection
static-members

6 ответов

4
Лучший ответ

Вы не можете, в принципе. 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>

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

  • 0
    Спасибо, Джон. Сначала я сделал то же самое, используя Generics. И пытался найти неуниверсальную альтернативу. Но я знаю, что это невозможно. Еще раз спасибо.
2

Я не хочу использовать typeof (typename) из-за проблем с наследованием.

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

Я бы рефакторинг для решения, которое использует экземпляр instace..., имеет Type.

0

Вам не нужно беспокоиться о наследовании, если свойство static; он не может быть переопределен, поэтому он всегда будет объявлен в базовом классе. Использование typeof - путь.

0

Если вы не хотите использовать typeof(), вам не повезло, потому что это единственный способ получить объект Type из статического класса (если вы не хотите найти тип, вызвав Type.GetType() и найдите его по имени)

Я не вижу проблемы с наследованием.

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);
0

Вы можете использовать класс System.Diagnostics.StackFrame в статическом методе, подобном этому:

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
  • 1
    Это будет иметь ту же проблему, что и OP с typeof - он даст базовый тип, а не производный тип.
  • 0
    Я отвечаю на вопрос «В нестатическом члене я могу получить тип текущего класса, используя this.GetType (), но как мне сделать это в статическом члене класса [без использования typeof ()]?». Наследственные вещи не имеют смысла для меня. Но я думаю, что typeof () гораздо проще в использовании и понимании.
0

Родитель не знает, сколько у него детей. Но ребенок знает о своем родителе. Единственный способ, которым родитель должен знать о ребенке, - это полиморфизм, который не является атрибутом статических членов.

То, что вы пытаетесь сделать, - это знать о дочернем классе в общедоступном статическом свойстве родителя. Почему бы вам не рассмотреть отправку ссылки на дочерний класс в качестве параметра в статическом методе в базовом классе, а затем в базовом классе есть ссылка на дочерний класс, вызвав его метод GetType...

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
  • 0
    читать редактирование ..
  • 0
    Вместо статического свойства используйте статический метод и передайте ссылку на ваш дочерний класс.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню