2009-06-12 6 views
0

Я пытаюсь найти эквивалент PropertyInfo.AddValueChanged для FieldInfo. Мне просто нужно получить событие в любое время, когда значение поля изменится. Я предполагаю, что нет ничего подобного, и мне придется манипулировать кодом IL или что-то в этом роде. Я готов пойти по этому пути, но любые предложения о том, как я должен это делать? И есть ли эквивалент AddValueChanged для полей, о которых я не знаю, поэтому мне не нужно идти по этому маршруту?Свойство PropertyInfo.AddValueChanged для полей?

Спасибо.

+0

Это фактически для элемента управления сеткой свойств, который также работает для полей и хеш-таблиц. Поэтому я должен быть уведомлен, когда меняются вещи вне моего контроля. Так что обертывание вещей в свойстве не является вариантом, потому что я не пишу класс, который я размышляю. Вот почему я упомянул код IL ... Я думал, что с помощью какой-то магии я могу создать свойство во время выполнения, чтобы обернуть поле и отправить событие в свой набор accessor ... – Thrash505

ответ

1

Почему бы не просто обернуть поле в свойстве и реализовать событие при изменении (т. Е. Сделать свой класс INotifyPropertyChanged или ваш собственный эквивалентный)?

Это одна прекрасная вещь о свойствах - они позволяют вам определять поведение таким образом. Поля не имеют никакой эквивалентности, и манипуляция ИЛ не изменит этого. Пока это поле, оно не будет уведомлять.

+0

Это фактически для элемента управления сеткой свойств, который также работает для полей и хеш-таблиц. Поэтому я должен быть уведомлен, когда меняются вещи вне моего контроля. Так что обертывание вещей в свойстве не является вариантом, потому что я не пишу класс, который я размышляю. Вот почему я упомянул код IL ... Я думал, что с помощью какой-то магии я мог создать свойство во время выполнения, чтобы обернуть поле и отправить событие в свой набор accessor ... – Thrash505

+0

К сожалению, нет способа в .NET (в CLR), чтобы указать, когда изменяется поле. Поле - это просто значение - вам придется регулярно его опроса, чтобы искать изменения, если вы хотите этого поведения. –

+0

Вы, кажется, правы, я несколько раз искал несколько дней, и я не вижу способа изменить существующий код во время выполнения; вы можете создавать только новые типы и т. д. Я собираюсь так долго вытягивать значения полей, чтобы проверять изменения. Благодарю. – Thrash505

0

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

+0

PostSharp кажется, что он должен быть способным из того, что мне нужно, потому что в функциях сказано: «Добавить поведение в поля», но я не могу найти пример, демонстрирующий эту функциональность. – Thrash505

0

Как указано в других ответах, с ограниченной информацией, которую вы предоставили, я предлагаю вам выполнить любые назначения значений через аксессуар поля. Если это должно быть вне любого класса, вы можете создать отдельный класс (или struc) (и поместить изменение поля в аксессуар.) Если вам не нужны несколько экземпляров этого поля, вы можете объявить его статическим и получить доступ только это через его accesor.

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^