.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