Отражение: получить FieldInfo из PropertyInfo - PullRequest
2 голосов
/ 20 апреля 2010

Я делаю динамическую генерацию кода с использованием Reflection, и я столкнулся с ситуацией, когда мне нужно получить поле поддержки свойства (если оно есть), чтобы использовать его объект FieldInfo.

Теперь я знаю, что вы можете использовать

.IsDefined(typeof(CompilerGeneratedAttribute), false);

в FieldInfo, чтобы узнать, сгенерирован ли он автоматически, поэтому я предполагаю, что есть аналогичная вещь для свойств, которые автоматически генерируют поля?

Cheers, Ed

Ответы [ 3 ]

8 голосов
/ 20 апреля 2010

Методы get_ и set_ для свойств также применяют к ним CompilerGeneratedAttributed. Хотя нет сильной связи через атрибуты, существует соглашение об именах, используемое для полей поддержки свойства auto:

public string Foo { get; set;}

Создает член private string <Foo>k__BackingField (здесь < и > являются частью имени, поскольку они допустимы в IL, но не в C #; они не имеют ничего общего с генериками).

В качестве примера получим список всех автоматических свойств в классе вместе с их полями поддержки:

t.GetProperties().Where(p => 
    (p.GetGetMethod() ?? p.GetSetMethod()).IsDefined(typeof(CompilerGeneratedAttribute), false))
   .Select(p => new 
   { 
      Property = p, 
      Field = t.GetField(string.Format("<{0}>k__BackingField", p.Name),
          System.Reflection.BindingFlags.NonPublic | 
          System.Reflection.BindingFlags.Instance) 
   });
3 голосов
/ 20 апреля 2010

Для этого не существует встроенного метода, поскольку наличие свойства не обязательно гарантирует наличие вспомогательного поля.

Я нашел эту статью , которая объясняет один из способов сделать это. Он включает в себя получение IL-адреса установщика свойства и его разбор в поисках доказательств того, что поле установлено.

0 голосов
/ 20 апреля 2010

Андрей прав.

На самом деле, свойство - это просто «указатель» на методы, обычно получатели / установщики, когда они генерируются Visual Studio или другим языком высокого уровня (большую часть времени).

Разбор метода установки не так прост. И поскольку внутренние сеттеры являются просто еще одним ванильным методом, они могут использовать более одного поля или вообще не использовать его или даже вызывать другие методы. Возможно, вы можете найти решение для распространенных сценариев, но вам нужно проанализировать байт-код IL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...