Просто чтобы добавить контекст того, что сказал Джон Скит: даже в IL это невозможно. Допустим, для ударов вы смогли получить MetadataToken для свойства, написав свой собственный компилятор и вставив маркер метаданных свойства в атрибут. Во время выполнения вы не сможете попросить модуль, из которого получено свойство, разрешить токен метаданных; Вы получите это сообщение:
Этот API не поддерживает токены PropertyInfo.
Способ проверить это - получить PropertyInfo
любого свойства и запросить у модуля, который определяет тип, содержащий свойство, значение ResolveMember
, которое принимает значение int
токена метаданных, и передать его PropertyInfo.MetadataToken
:
Console.WriteLine(propInfo.DeclaringType.Module.ResolveMember(propInfo.MetadataToken));
API не был разработан для этой цели, сами свойства - это просто метаданные, которые используются вместе с вашей программой, чтобы помочь связать методы с общим контекстом для использования с компиляторами и IDE. Как только компилятор берет ваш код и делает свое волшебство, свойство никогда не появляется ни разу в IL.
Если бы вы могли вставить MetadataToken
свойства в атрибут, лучшее, что вы могли бы сделать, это также вставить MetadataToken
типа в атрибут и заставить его извлечь объект PropertyInfo
с помощью итерации Свойства типа, и тот с совпадающим MetadataToken
будет вашей целью.
Крайне важно понимать, что MetadataToken
уникальны только в пределах модуля, в котором они существуют. Я бы сказал, сборка, но несколько сборок модулей убивают эту идею.
Я знаю об этом только из написания парсера метаданных ECMA-335.