Быть увольнением событие / функционирует на свойстве? (C#)

REPLACE()

Пример:

... GROUP_CONCAT(REPLACE(name, ',', '\\,')) 

Примечание необходимо использовать двойную обратную косую черту (при выходе из запятой с обратной косой чертой), потому что сама обратная косая черта является волшебной, и \, становится просто ,.

10
задан Lloyd Powell 11 May 2011 в 07:26
поделиться

8 ответов

По сути, вы не можете ... не использовать что-то вроде API отладчика для внедрения кода во время выполнения и изменения IL исходной библиотеки (и я не рекомендую ни одно из этих решений; кроме всего прочего это может нарушить лицензию библиотеки).

Обычно, если свойство не поддерживает уведомление, оно не поддерживает уведомление. Вам следует найти другой способ решения вашей проблемы. (Сработает ли, например, опрос?)

10
ответ дан 3 December 2019 в 18:35
поделиться

Вы не можете сделать это напрямую [как сказал Джон Скит], если только он не виртуальный, вы можете перехватывать все создания экземпляров класса, и нет никаких изменений в поддерживающем поле, которое влияет на реальное "значение" propget.

Единственный способ грубой силы - это использовать Mono.Cecil или MS CCI для инструментирования установщика свойств а-ля this DimeCast на Cecil . (Или PostSharp)

Однако это не приведет к перехвату внутренних изменений в поле поддержки (если оно вообще есть). (Вот почему обертывание, вероятно, не сработает.)

ОБНОВЛЕНИЕ: с учетом вашего обновления, что вы определенно пытаетесь уловить изменение основного поля, единственный способ сделать это - использовать PS / CCI / Cecil и проанализировать поток для перехватывать все обновления полей. Короче, не очень осуществимо.

5
ответ дан 3 December 2019 в 18:35
поделиться

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

Если ваше приложение является однопоточным по отношению к этому объекту, ваше самое чистое решение - сделать вызовы метода к этому объекту через прокси-объект. Он должен будет проверять состояние свойства до и после и вызывать событие в случае его изменения.

Вот простой пример того, о чем я говорю:

3
ответ дан 3 December 2019 в 18:35
поделиться

Как упоминалось ранее, наиболее прямой метод (и тот, который требует наименьшего изменения кода) - это использование библиотеки АОП, такой как PostSharp.

Однако решение может быть достигнуто с использованием традиционный C # /. NET с использованием свойства зависимости паттерн , который с большим эффектом используется в WPF. Я предлагаю прочитать об этом и рассмотреть возможность внедрения такой системы (или, по крайней мере, ее упрощенной версии) для вашего проекта, если это необходимо.

2
ответ дан 3 December 2019 в 18:35
поделиться

Не могли бы вы унаследовать от класса и скрыть свойство? Примерно так ...

class MyClass : BaseClass
{
    // hide base property.
    public new bool MyProperty
    {
        get
        {
            return base.MyProperty;
        }

        set
        {
            base.MyProperty = value;
            RaiseMyPropertyChangedEvent();
        }
    }
}
1
ответ дан 3 December 2019 в 18:35
поделиться

Вам нужно будет создать класс, который обертывает класс в dll, в свойстве setter просто вызовите там событие, используя обычные методы.

1
ответ дан 3 December 2019 в 18:35
поделиться

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

РЕДАКТИРОВАТЬ: ... только если свойство является виртуальным в родительском классе ...

-1
ответ дан 3 December 2019 в 18:35
поделиться

Я думаю, что идея обертки у Алекса хорошая, учитывая, что для вас самое важное - это то, что вы знаете, что значение изменяется перед использованием , вы можете просто переместить уведомление в геттер, избегая беспокойства об изменении внутреннего значения. Таким образом вы получите что-то похожее на опрос, но надежное:

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;
        }
    }
}
0
ответ дан 3 December 2019 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: