Как стать автором
Обновить

Комментарии 7

Мсье знает толк в извращениях
Ну покажите не «извращенное», по вашему, решение.
Здесь можно в лог записать левый операнд присваивания, например:
Trace.WriteLine(string.Format("{0} < — {1}", property.Body, value));
А вы бы как реализовали?
Попробуйте применить аспектно-ориентированный подход. Вот небольшая статья об этом.
Про PostSharp я знаю.

Он вносит изменения в MSIL, а мне бы этого не хотелось.

Кроме этого если доступа к классу нет, то как
«Проатрибутить» свойства?
Кроме этого при логировании, например, мы не узнаем откуда было присвоение.
Страшно представить. А можно все-таки сценарий, для чего может понадобиться логгирование присваивания свойств, да еще и у объекта неподконтрольного класса?

Если аспекты не применить, то я бы стал решать это через t4 template. Можно сгенерировать любую оболочку(прокси, декоратор, что угодно). Раз уж все равно пришлось переписать весь код с «a.Prop = value» на «a.Set(a=>a.Prop, value)», то почему бы его не переписать на «new proxyA(a).Prop = value». И если кода с возможными присвоениями много, а точка входа одна, то new можно вызвать в одном месте, а дальше весь код останется вообще не тронут.
Страшно представить.
Да вот представьте есть такое в проекте, что идет логирование и проверка значения присваивания, причем один и тот же код повторяется много раз. В класс влезть нельзя.
Я ничего более подходящего не придумал нежели переписать так.
Насчет прокси я тоже думал, но тогда нужно каждое свойство поддержать, а кроме этого в сеттере вам не известно само левое выражение присваивания, а только правое выражение.
Нужно было залогировать все левое выражение (весь путь через точку).
А также неизвестен реальный callermembername.
(Я в примерн просто не стал приводить все параметры set).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации