2010-12-28 3 views
2

У меня есть класс Foo со многими свойствами:Как внедрить метод для автоматического имущества в .Net Framework

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

    public int Property2 { get; set; } 

    public int Property3 { get; set; } 
} 

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

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

ответ

0

Я нашел простой способ сделать это. Я использую EasyProp, который использует замок 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

Разве это не то, что предложили @ rally25rs? –

+0

Почти. Я не совсем понял, как работать с DynamicProxy, но мне помог EasyProp. – dublicator

4

Я не думаю, что есть способ сделать это во время исполнения с отражением. То, что вы, вероятно, захотите сделать, это использовать AOP (аспектно-ориентированный) подход, но это тоже не поддерживается платформой .NET. Вы можете использовать PostSharp, чтобы сделать это, если вы не возражаете использовать расширение компилятора, или посмотрите на использование Unity2 to do 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

PostSharp является вероятно, лучшее решение здесь, если вы не хотите внести структурные изменения в свое приложение в su это требование. –

+0

@tom. Я склонен согласиться с тем, что PostSharp потребует наименьшего изменения уже существующего кода, поскольку он имеет преимущество в том, что для генерации и ввода прокси-сервера требуется время генерации прокси-сервера, а не во время выполнения. Некоторые люди не любят использовать расширение компилятора, поэтому я добавил другие варианты. Примечание; MS должна просто купить права на PostSharp и построить его в стандартный компилятор!:) – CodingWithSpike

+0

С PostSharp возникла проблема. Он не хочет взаимодействовать с System.Data.SQLite: он сказал, что сборка несовместима. – dublicator

0

Вы можете использовать расширение int класса здесь. Или какие-либо данные задают ваши свойства getter/setter.

Например

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

Extension Method in C# 2.0

Смежные вопросы