How to inject method to auto property in .Net Framework

谁说我不能喝 提交于 2019-12-19 10:05:21

问题


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


回答1:


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;



回答2:


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




回答3:


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


来源:https://stackoverflow.com/questions/4546935/how-to-inject-method-to-auto-property-in-net-framework

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!