如何在.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); }