Отражение .NET - Поиск типа , который определяет статический элемент

StackOverflow https://stackoverflow.com/questions/395314

Вопрос

У меня проблема с рефлексией.Мне нужно найти тип, который создает экземпляр статического элемента.Мой код выглядит примерно так:

    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 затем можно было бы установить значение поля только для чтения, используя отражение (если это работает - я еще не пробовал;может быть применен режим только для чтения).Хотя это немного противно...В качестве альтернативы, вы могли бы просто получить свойство из репозитория, когда оно вам понадобится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top