C # WPF Как динамически установить метод установки свойств? - PullRequest
5 голосов
/ 20 июня 2011

Я искал вокруг, но просто не могу найти то, что искал, поэтому я попробую здесь.

Положение: У меня есть класс MainWindow и MainWindowData. В MainWindowData есть только открытые свойства, определенные с атрибутом UpdateGUI.

public class UpdateGUI : Attribute { }

public class MainWindowData
{
    [UpdateGUI]
    public string TESTVAR { get; set; }
}

Теперь я хочу добавить метод к методу-установщику каждого свойства в MainWindowData. Более конкретно:

void OnPropertyChanged(String PropertyName);

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

List<PropertyInfo> properties = (from pi in typeof(MainWindowData).GetProperties()
                                 where pi.GetCustomAttributes(typeof(UpdateGUI), false).Any()
                                 select pi).ToList();

Это дает мне хороший список всех свойств, которые мне нужно обновить.

Итак, вопрос: как я могу сделать так, чтобы свойства динамически преобразовывались из:

[UpdateGUI]
public string TESTVAR { get; set; }

до:

[UpdateGUI]
private string _TESTVAR;
public string TESTVAR { 
    get {
        return _TESTVAR;
    }
    set {
        _TESTVAR = value;
        OnPropertyChanged("TESTVAR");
    }
}

Спасибо за любую помощь! Это будет высоко оценено :) 1020 *

Привет

Ответы [ 3 ]

5 голосов
/ 20 июня 2011

То, что вы ищете, было решено в концепции Аспектно-ориентированного программирования (AOP).

Один пример - в PostSharp , (также см. Подробности здесь ), который позволяет вам записывать ваши классы data / viewmodel, например так:

[NotifyPropertyChanged]
public class Shape
{
    public double X { get; set; }
    public double Y { get; set; }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
}

Если вам не нравится PostSharp, я уверен, что другие AOP-фреймворки имеют аналогичную функциональность.

EDIT

Я только что нашел NotifyPropertyWeaver , который делает это для вас, не требуя полной AOP-инфраструктуры.

Он использует материал Mono.Cecil для вставки кода уведомления во время компиляции и устанавливается через NuGet (это я и сделал) или с веб-сайта проекта.

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

[NotifyProperty]
public int FooBar { get; set; }

Одна приятная особенность, которую я нашел в ней, была возможность объявлять зависимости между свойствами. В этом случае RaisePropertyChanged("FoobarTimesTwo") будет вызываться при каждом изменении FooBar.

[DependsOn("FooBar")]
public int FoobarTimesTwo
{
    get { return FooBar * 2; }
}
1 голос
/ 20 июня 2011

В дополнение к AOP-фреймворкам, таким как PostSharp, существуют также такие вещи, как:

Mono.Cecil

С помощью этого инструмента вы можете взять сборку, изменить ее коди сохраните его обратно

Есть несколько статей LinFu об АОП, которые могут помочь

Статьи LinFu о CodeProject

0 голосов
/ 20 июня 2011

Фреймворк с открытым исходным кодом ImpromptuInterface.MVVM использует динамические функции C # 4.0 для добавления автоматических свойств, которые поддерживают изменение свойств. Это ImpromptuViewModel работает как ExpandoObject, но также имеет другие функции, помогающие с MVVM.

...