Как внедрить метод для автоматического свойства в .Net Framework - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть класс Foo со многими свойствами:

public class Foo
{
    public int Property1 { get; set; }

    public int Property2 { get; set; }

    public int Property3 { get; set; }
}

В другом классе у меня есть метод, например,

public void SomeMethod()
{
    //...
}

Как внедрить этот метод в каждый набор свойств в классе Foo? Я использую .Net Framework 2.0

Ответы [ 3 ]

4 голосов
/ 28 декабря 2010

Я не думаю, что есть способ сделать это во время выполнения с помощью отражения.Вероятно, вы захотите использовать AOP (аспектно-ориентированный) подход, но он тоже не поддерживается платформой .NET.Вы можете использовать PostSharp , чтобы сделать это, если не возражаете против использования расширения компилятора, или использовать Unity2 для выполнения AOP .

Редактировать: Вы можететакже рассмотрим Castle DynamicProxy .Или, если вы хорошо разбираетесь в DynamicMethods и IL-коде, вы можете создать свой собственный прокси-генератор класса.

Однако, я думаю, что в большинстве случаев вам придется соответствующим образом кодировать оставшуюся часть приложения для обработкипрокси.Другими словами, вместо того, чтобы делать:

Foo f = new Foo();
f.Property1 = 123;

Вы должны сделать что-то вроде:

Foo f = Generator.GetProxy<Foo>(); // this code is fake. just indicates that you need to get an instance of Foo from a proxy generator, be it DynamicProxy or Unity or whatever.
f.Property1 = 123;
0 голосов
/ 29 декабря 2010

Я нашел простой способ сделать это.Я использую EasyProp , который использует Castle DynamicProxy :

Мой класс:

[AfterPropertySetFilter(typeof(NotifyPropertyChanged))]
public class Foo : INotifyPropertyChanged
{
    public virtual int Property1 { get; set; }

    public virtual int Property2 { get; set; }

    public virtual int Property3 { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;
}

Пример использования:

    EasyPropBuilder epb=new EasyPropBuilder();
    Foo foo = epb.Build<Foo>();
    foo.Property1 = 1;
    foo.PropertyChanged += OnPropertyChanged;
    foo.Property1 = 2;

Также вам необходимо добавить такой метод:

public static void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
    Console.WriteLine("Property Changed: " + propertyChangedEventArgs.PropertyName);
}
0 голосов
/ 28 декабря 2010

Вы можете использовать расширение класса int здесь.Или какой бы тип данных вы ни указали в свойствах вашего метода получения / установки.

Например

public class Foo
{
    public int Property1 { get; set; }    
    public int Property2 { get; set; }    
    public int Property3 { get; set; }
}

Метод расширения будет выглядеть следующим образом

public static class IntExtension
{
    public static void SomeMethod(this int property)
    {
        // ...
    }
}

См. Следующую статьюэто с .NET 2.0.Требуется, чтобы вы использовали VisualStudio, который поддерживает C # 3.0, но он по-прежнему будет работать с платформой вывода как C # 2.0

Метод расширения в C # 2.0

...