.NET Reflection — поиск типа, определяющего статический член

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

    private class SimpleTemplate : PageTemplate
    {
        internal static readonly IPageProperty NameProperty =
            PropertyRepository.Register("Name");
    }

PropertyRepository — это хранилище свойств (очевидно). Он отслеживает все свойства, которые были зарегистрированы с использованием системы типов, которую я создаю.

Чтобы сделать это успешно, мне нужно отслеживать все свойства, а также тип, для которого они определены. В противном случае, если определены два свойства с одинаковыми именами, репозиторий свойств не сможет отличить их друг от друга.

Итак, что я хочу сделать, так это выяснить тип, который определяет NameProperty, и сохранить тип, а также имя. Как я могу это сделать?

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

Решение, я полагаю, будет включать размышления. Есть ли способ использовать отражение, чтобы определить, какой тип вызывает статический метод? Статические свойства неявно создаются с помощью статического конструктора (который генерируется компилятором). Есть ли способ получить доступ к этому конструктору? Это кажется возможным, я просто не могу понять, как это сделать.

Другими словами: если метод A вызывает метод B, может ли B каким-либо образом сказать, что он был вызван из A с использованием отражения? Я думаю, что есть, но я не могу понять, как.

Кто-нибудь знает?

Редактировать: я просмотрел класс StackFrame, и, хотя он делает то, что мне нужно, он может быть ненадежным в производственном коде (а мне это нужно).


person Karl    schedule 27.12.2008    source источник


Ответы (1)


Это почти дубликат этот вопрос, но не совсем. Хотя посмотрите на его ответы.

Лично я думаю, что я бы прошел в тип. Альтернативой может быть использование атрибута, например.

[PropertyName("Name")]
private static readonly IPageProperty NameProperty = null;

static
{
    PropertyRepository.RegisterProperties(typeof(SimpleTemplate));
}

PropertyRepostiory.RegisterProperties может затем установить значение поля только для чтения, используя отражение (если это работает - я не пробовал, может быть принудительно применено только для чтения). Хотя это немного непривычно... В качестве альтернативы вы можете просто получить свойство из репозитория, когда оно вам понадобится.

person Jon Skeet    schedule 27.12.2008
comment
Да, ссылка, на которую вы указываете, явно помогает. И ваш комментарий заставляет меня понять, что есть более простой способ сделать это, даже если это будет не совсем то, что вы предлагаете. Спасибо! - person Karl; 27.12.2008