Отражение .NET - Поиск типа , который определяет статический элемент
-
23-08-2019 - |
Вопрос
У меня проблема с рефлексией.Мне нужно найти тип, который создает экземпляр статического элемента.Мой код выглядит примерно так:
private class SimpleTemplate : PageTemplate
{
internal static readonly IPageProperty NameProperty =
PropertyRepository.Register("Name");
}
PropertyRepository - это хранилище свойств (очевидно).Он отслеживает все свойства, которые были зарегистрированы с помощью системы типов, которую я создаю.
Чтобы сделать это успешно, мне нужно отслеживать все свойства, а также тип, для которого они определены.В противном случае, если определены два свойства с одинаковым именем, репозиторий свойств не сможет отличить их друг от друга.
Итак, что я хочу сделать, это выяснить тип, который определяет свойство NameProperty, и сохранить тип, а также имя.Как я могу это сделать?
Я хочу использовать строгую типизацию, т. е.Я не хочу отправлять тип в качестве аргумента в PropertyRepository.Register .Это было бы чревато ошибками, поскольку я не могу проверить правильность аргумента type.
Решение, я полагаю, потребовало бы размышлений.Есть ли какой-нибудь способ использовать отражение, чтобы определить, какой тип вызывает статический метод?Статические свойства неявно создаются с использованием статического конструктора (который генерирует компилятор).Есть ли у меня способ получить дескриптор этого конструктора?Это кажется осуществимым, я просто не могу понять, как это сделать.
Другими словами:Если метод A вызывает метод B, есть ли какой-либо способ B определить, что он был вызван из A с использованием отражения?Я предполагаю, что есть, но я не могу выяснить, как.
Кто-нибудь знает?
Редактировать: Я просмотрел класс StackFrame, и хотя кажется, что он делает то, что я хочу, он может быть ненадежен в производственном коде (а мне это нужно).
Решение
Это почти дубликат этот вопрос, но не вполне.Однако посмотрите на ответы этого человека.
Лично я думаю, что прошел бы мимо этого типа.Альтернативой могло бы быть использование атрибута, например
[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;
static
{
PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}
PropertyRepostiory.RegisterProperties
затем можно было бы установить значение поля только для чтения, используя отражение (если это работает - я еще не пробовал;может быть применен режим только для чтения).Хотя это немного противно...В качестве альтернативы, вы могли бы просто получить свойство из репозитория, когда оно вам понадобится.