Да вот представьте есть такое в проекте, что идет логирование и проверка значения присваивания, причем один и тот же код повторяется много раз. В класс влезть нельзя.
Я ничего более подходящего не придумал нежели переписать так.
Насчет прокси я тоже думал, но тогда нужно каждое свойство поддержать, а кроме этого в сеттере вам не известно само левое выражение присваивания, а только правое выражение.
Нужно было залогировать все левое выражение (весь путь через точку).
А также неизвестен реальный callermembername.
(Я в примерн просто не стал приводить все параметры set).
Ну покажите не «извращенное», по вашему, решение.
Здесь можно в лог записать левый операнд присваивания, например:
Trace.WriteLine(string.Format("{0} < — {1}", property.Body, value));
А вы бы как реализовали?
При использовании коллекции в WPF, для изменения коллекции асинхронно, не в потоке UI, можно реализовать как предлагается по этой ссылке.
Иначе возникнет ошибка {«this type of collectionview does not support changes to its sourcecollection from a thread different from the dispatcher thread.»}
Указанную статью я знаю. Можно сделать и так, смысла это не меняет. Но там не учтен п.1 из моей статьи
this.CheckReentrancy();
, который все-таки должен быть. Иначе в процессе обработки данных в обработчиках события CollectionChanged, актуальность данных не гарантируется.
То есть возможны (в зависимости от комбинации операций над данными в текущем методе и в обработчиках события CollectionChanged):
— потерянное обновление (lost update)
— «грязное» чтение (dirty read)
— неповторяющееся чтение (non-repeatable read)
— фантомное чтение (fantom read).
Про бесконечный цикл. Значение переданного параметра IEnumerable может быть реализовано криво, так что получится бесконечный цикл. При использовании ToList он тоже будет бесконечным, но до начала изменения нашей коллекции, а не в момент изменения. Если создание нового объекта раздражает, то можно убрать данную строку.
На добавление/удаление каждого элемента у вас вызовется по три события.
Например, если коллекция служит источником для отображения на форме, обновление контрола будет производиться на добавление/удаление каждого элемента, а это не хорошо, если элементов много.
А приведенном мной примере вызовутся три события только в конце обработки всех элементов. То есть обновление контрола произойдет один раз.
Да, можно. Только загвоздка в том, что если бы было точное описание, что в том или ином типе такой-то namespace, то это можно было бы сделать заменой. А так как такого описания нет, а возможно даже эти namespace будут указываться в сообщениях сервиса в рандомном порядке, то правка Reference.cs или WSDL не приведет к решению.
Да можно было бы и не править имя параметра «return» на «ArrayOfRegionInfo» в Reference.cs, а заменить его в инспекторе, для однообразия подхода. Но просто я решил заменить в Reference.cs, чтобы показать и этот вариант.
Кроме этого точно нужно заменять в инспекторе поступающее в сообщении имя параметра «gensym-\d+» (\d+ — это цифры, которые формируются рандомно) в методе GetVersion на «return», как указано в WSDL, так как данный метод тоже не заработает без указанных манипуляций в инспекторе. В WSDL или Reference.cs это уже не поправишь, так как соответствие не однозначеное.
Это же было с 3 по 5 пункт.
А 9 пункт с 8 не связан, открываем терминал, чтобы запустить томкат, далее (после 9) это описано.
Может я не допонял Ваш комментарий?
Я ничего более подходящего не придумал нежели переписать так.
Насчет прокси я тоже думал, но тогда нужно каждое свойство поддержать, а кроме этого в сеттере вам не известно само левое выражение присваивания, а только правое выражение.
Нужно было залогировать все левое выражение (весь путь через точку).
А также неизвестен реальный callermembername.
(Я в примерн просто не стал приводить все параметры set).
Он вносит изменения в MSIL, а мне бы этого не хотелось.
Кроме этого если доступа к классу нет, то как
«Проатрибутить» свойства?
Кроме этого при логировании, например, мы не узнаем откуда было присвоение.
Здесь можно в лог записать левый операнд присваивания, например:
Trace.WriteLine(string.Format("{0} < — {1}", property.Body, value));
А вы бы как реализовали?
При использовании коллекции в WPF, для изменения коллекции асинхронно, не в потоке UI, можно реализовать как предлагается по этой ссылке.
Иначе возникнет ошибка {«this type of collectionview does not support changes to its sourcecollection from a thread different from the dispatcher thread.»}
То есть возможны (в зависимости от комбинации операций над данными в текущем методе и в обработчиках события CollectionChanged):
— потерянное обновление (lost update)
— «грязное» чтение (dirty read)
— неповторяющееся чтение (non-repeatable read)
— фантомное чтение (fantom read).
CollectionView
CompositeCollectionView
ListCollectionView
CollectionViewSource
Спасибо за ссылку.
На добавление/удаление каждого элемента у вас вызовется по три события.
Например, если коллекция служит источником для отображения на форме, обновление контрола будет производиться на добавление/удаление каждого элемента, а это не хорошо, если элементов много.
А приведенном мной примере вызовутся три события только в конце обработки всех элементов. То есть обновление контрола произойдет один раз.
Чтобы исключить возможный бесконечный цикл ниже:
Напишите, пожалуйста, в комментах реализацию SuspendNotification и ResumeNotification.
Да можно было бы и не править имя параметра «return» на «ArrayOfRegionInfo» в Reference.cs, а заменить его в инспекторе, для однообразия подхода. Но просто я решил заменить в Reference.cs, чтобы показать и этот вариант.
Кроме этого точно нужно заменять в инспекторе поступающее в сообщении имя параметра «gensym-\d+» (\d+ — это цифры, которые формируются рандомно) в методе GetVersion на «return», как указано в WSDL, так как данный метод тоже не заработает без указанных манипуляций в инспекторе. В WSDL или Reference.cs это уже не поправишь, так как соответствие не однозначеное.
8. ввести в терминале
9. Этот пункт тогда не нужен, предыдущую сессию терминала просто не закрывать.
А 9 пункт с 8 не связан, открываем терминал, чтобы запустить томкат, далее (после 9) это описано.
Может я не допонял Ваш комментарий?