Пример:
... GROUP_CONCAT(REPLACE(name, ',', '\\,'))
Примечание необходимо использовать двойную обратную косую черту (при выходе из запятой с обратной косой чертой), потому что сама обратная косая черта является волшебной, и \,
становится просто ,
.
По сути, вы не можете ... не использовать что-то вроде API отладчика для внедрения кода во время выполнения и изменения IL исходной библиотеки (и я не рекомендую ни одно из этих решений; кроме всего прочего это может нарушить лицензию библиотеки).
Обычно, если свойство не поддерживает уведомление, оно не поддерживает уведомление. Вам следует найти другой способ решения вашей проблемы. (Сработает ли, например, опрос?)
Вы не можете сделать это напрямую [как сказал Джон Скит], если только он не виртуальный, вы можете перехватывать все создания экземпляров класса, и нет никаких изменений в поддерживающем поле, которое влияет на реальное "значение" propget.
Единственный способ грубой силы - это использовать Mono.Cecil или MS CCI для инструментирования установщика свойств а-ля this DimeCast на Cecil . (Или PostSharp)
Однако это не приведет к перехвату внутренних изменений в поле поддержки (если оно вообще есть). (Вот почему обертывание, вероятно, не сработает.)
ОБНОВЛЕНИЕ: с учетом вашего обновления, что вы определенно пытаетесь уловить изменение основного поля, единственный способ сделать это - использовать PS / CCI / Cecil и проанализировать поток для перехватывать все обновления полей. Короче, не очень осуществимо.
Возможно, единственный реальный способ сделать это - создать своего рода компонент-наблюдатель, работающий в отдельном потоке, чья задача - читать свойство через определенные промежутки времени и генерировать событие, когда стоимость недвижимости меняется. Конечно, это решение попадает в мутные воды многопоточности и синхронизации.
Если ваше приложение является однопоточным по отношению к этому объекту, ваше самое чистое решение - сделать вызовы метода к этому объекту через прокси-объект. Он должен будет проверять состояние свойства до и после и вызывать событие в случае его изменения.
Вот простой пример того, о чем я говорю:
Как упоминалось ранее, наиболее прямой метод (и тот, который требует наименьшего изменения кода) - это использование библиотеки АОП, такой как PostSharp.
Однако решение может быть достигнуто с использованием традиционный C # /. NET с использованием свойства зависимости паттерн , который с большим эффектом используется в WPF. Я предлагаю прочитать об этом и рассмотреть возможность внедрения такой системы (или, по крайней мере, ее упрощенной версии) для вашего проекта, если это необходимо.
Не могли бы вы унаследовать от класса и скрыть свойство? Примерно так ...
class MyClass : BaseClass
{
// hide base property.
public new bool MyProperty
{
get
{
return base.MyProperty;
}
set
{
base.MyProperty = value;
RaiseMyPropertyChangedEvent();
}
}
}
Вам нужно будет создать класс, который обертывает класс в dll, в свойстве setter просто вызовите там событие, используя обычные методы.
Вы можете попробовать унаследовать его и использовать вместо него потомок. Переопределите "набор" свойства, чтобы оно инициировало событие.
РЕДАКТИРОВАТЬ: ... только если свойство является виртуальным в родительском классе ...
Я думаю, что идея обертки у Алекса хорошая, учитывая, что для вас самое важное - это то, что вы знаете, что значение изменяется перед использованием , вы можете просто переместить уведомление в геттер, избегая беспокойства об изменении внутреннего значения. Таким образом вы получите что-то похожее на опрос, но надежное:
class MyClass : BaseClass
{
//local value
private bool local;
//first access yet?
private bool accessed = false;
// Override base property.
public new bool MyProperty
{
get
{
if(!accessed)
{
// modify first-get case according to your taste, e.g.
local = base.MyProperty;
accessed = true;
RaiseMyPropertyChangedBeforeUseEvent();
}
else
{
if(local != base.MyProperty)
{
local = base.MyProperty;
RaiseMyPropertyChangedBeforeUseEvent();
}
}
return local;
}
set
{
base.MyProperty = value;
}
}
}