如何在.Net Framework中为自动属性注入方法
我有一些具有许多属性的类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
我不认为有一种方法可以在运行时使用reflection来做到这一点。 您可能想要做的是使用AOP(面向方面)方法,但.NET框架也不支持这种方法。 如果您不介意使用编译器扩展,或者考虑使用Unity2来执行AOP ,您可以使用PostSharp来执行此操作 。
编辑:您还可以考虑Castle DynamicProxy 。 或者,如果您已牢牢掌握DynamicMethods和IL代码,则可以创建自己的代理生成器类。
但是,我认为在大多数情况下,您必须适当地编写应用程序的其余部分来处理代理。 换句话说,而不是做:
Foo f = new Foo(); f.Property1 = 123;
你必须做类似的事情:
Foo f = Generator.GetProxy(); // 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;
您可以在此处使用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一起使用。 要求您使用支持C#3.0的VisualStudio,但它仍然可以作为C#2.0使用输出框架
C#2.0中的扩展方法
我找到了简单的方法来做到这一点。 我使用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.Property1 = 1; foo.PropertyChanged += OnPropertyChanged; foo.Property1 = 2;
您还需要添加此类方法:
public static void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { Console.WriteLine("Property Changed: " + propertyChangedEventArgs.PropertyName); }