How to inject method to auto property in .Net Framework

I have some class Foo with many properties:

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

    public int Property2 { get; set; }

    public int Property3 { get; set; }
}

In other class I have some method, e.g.

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

How to inject this method to every setter of properties in the class Foo? I use .Net Framework 2.0

Answers


I don't think there is a way to do that at runtime with reflection. What you would probably want to do is use an AOP (aspect-oriented) approach, but that too isn't really supported by the .NET framework. You could use PostSharp to do it, if you don't mind using a compiler extension, or look into using Unity2 to do AOP.

Edit: You could also consider Castle DynamicProxy. Or, if you have a firm grasp of DynamicMethods and IL code, you could make your own proxy generator class.

However, I think in most cases, you will have to code the rest of your application appropriately to handle the proxies. In other words, instead of doing:

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

You would have to do something like:

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;

You can use an extension of the int class here. Or whatever data type your getter/setter properties are.

For example

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

The extension method would look like this

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

See the following article to use it with .NET 2.0. Requires that you use a VisualStudio that supports C# 3.0 but it will still work with the output framework as C# 2.0

Extension Method in C# 2.0


I found easy way to do this. I use EasyProp, which uses Castle DynamicProxy:

My class:

[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;
}

Example of use:

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

Also you need to add such method:

public static void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
    Console.WriteLine("Property Changed: " + propertyChangedEventArgs.PropertyName);
}

Need Your Help

Codeigniter and jQuery application security issue or paranoia?

jquery codeigniter

I write a application in php - CodeIgniter framework and JavaScript - jQuery and Bootstarp frameworks.

NSOperationQueue finished wont start new method

objective-c methods selector nsoperation nsoperationqueue

When my observer tells me that there are no more operations, function is not called (performSelector...). Funny thing is that NSLog(@"queue has completed") is logged correctly.

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.