Как получить экземпляр System.Type типа класса в Static Member? - PullRequest
2 голосов
/ 14 июля 2009

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

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

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

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

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

EDIT

Вот моя цель.

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

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

Thnaks.

Ответы [ 6 ]

4 голосов
/ 14 июля 2009

Вы не можете, в основном. typeof (...) - это , что вам нужно использовать.

Имейте в виду, что если вы попытаетесь использовать:

Type type = MyDerivedType.SomeStaticProperty;

который объявлен в MyBaseType, что в итоге будет скомпилировано в

Type type = MyBaseType.SomeStaticProperty;

в любом случае. Статические члены в основном не полиморфны. Если вы попытаетесь использовать их полиморфно, вы столкнетесь с такими проблемами.

РЕДАКТИРОВАТЬ: Таким образом, из вашего редактирования, похоже, что вы пытаетесь сделать точно такой же тип вещи, с

MyEntity.TableName

вместо

EntityBase.TableName

Это просто не сработает. Компилятор выдаст код для получения EntityBase.TableName. Среда выполнения не имеет понятия «текущий класс». Здесь нет контекста.

В основном вам нужно изменить свой дизайн. Если вы хотите использовать наследование, вам может потребоваться параллельная иерархия - одна для метаданных (например, имена таблиц), а другая для реальных объектов. Так что у вас будет что-то вроде:

public class MyEntity : EntityBase<MyEntityType>

где MyEntityType наследуется от EntityType в параллельной иерархии. Тогда вы сможете использовать наследование в иерархии метаданных.

В качестве альтернативы, просто сделав EntityBase универсальным, вы сможете получить тип сущности, о которой вы говорите:

public class MyEntity : EntityBase<MyEntity>

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

2 голосов
/ 14 июля 2009

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

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

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

0 голосов
/ 14 июля 2009

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

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

public static string GetTableName(BaseClass childsObjectWrappedInBaseReference) {
   Type type = childsObjectWrappedInBaseReference.GetType();
   ....
   ....
}
0 голосов
/ 14 июля 2009

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

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

Type type = typeof(YourStaticClass);

Attribute[] attributes = type.GetCustomAttributes(...);
0 голосов
/ 14 июля 2009

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

0 голосов
/ 14 июля 2009

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

StackFrame currentStackFrame = new StackFrame();
Type type = currentStackFrame.GetMethod().DeclaringType;
...