Отражение .NET - Нахождение типа, который определяет статический член - PullRequest
0 голосов
/ 27 декабря 2008

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

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

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

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 27 декабря 2008

Это почти копия этого вопроса , но не совсем . Но посмотрите на ответы этого.

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

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

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

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

...