How to inject method to auto property in .Net Framework

前端 未结 3 1445
夕颜
夕颜 2021-01-15 15:15

I have some class Foo with many properties:

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

    public int Property2 { get; set; }

    public int         


        
相关标签:
3条回答
  • 2021-01-15 15:55

    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;
    
    0 讨论(0)
  • 2021-01-15 16:05

    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);
    }
    
    0 讨论(0)
  • 2021-01-15 16:08

    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

    0 讨论(0)
提交回复
热议问题