C# 如何在.Net Framework中将方法注入自动属性
我有一些具有许多属性的类Foo:C# 如何在.Net Framework中将方法注入自动属性,c#,reflection,.net-2.0,C#,Reflection,.net 2.0,我有一些具有许多属性的类Foo: public class Foo { public int Property1 { get; set; } public int Property2 { get; set; } public int Property3 { get; set; } } 在另一节课上,我有一些方法,例如 public void SomeMethod() { //... } 如何将此方法注入类Foo中的每个属性设置器? 我使用.NETFrame
public class Foo
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Property3 { get; set; }
}
在另一节课上,我有一些方法,例如
public void SomeMethod()
{
//...
}
如何将此方法注入类Foo中的每个属性设置器?
我使用.NETFramework2.0,我认为没有一种方法可以在运行时通过反射来实现这一点。您可能希望使用AOP(面向方面)方法,但是.NET框架并不真正支持这种方法。如果您不介意使用编译器扩展,或者考虑使用 编辑: 你也可以考虑。 或者,如果您对DynamicMethods和IL代码有很好的掌握,您可以创建自己的代理生成器类 但是,我认为在大多数情况下,您必须对应用程序的其余部分进行适当的编码,以处理代理。换句话说,与其做:
Foo f = new Foo();
f.Property1 = 123;
您必须执行以下操作:
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;
Foo f=Generator.GetProxy();//这个密码是假的。只是指示您需要从代理生成器获取一个Foo实例,可以是DynamicProxy或Unity或其他。
f、 房地产1=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)
{
// ...
}
}
请参阅以下文章,将其与.NET2.0一起使用。要求您使用支持C#3.0的VisualStudio,但它仍然可以作为C#2.0使用输出框架
我找到了一个简单的方法。我使用,它使用城堡: 我的班级:
[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>();
foo.Property1 = 1;
foo.PropertyChanged += OnPropertyChanged;
foo.Property1 = 2;
Postsharp可能是这里最好的解决方案,除非您希望对应用程序进行结构更改以支持此要求。@tom-我倾向于同意,Postsharp将要求对现有代码进行最小的更改,因为它的优点是在构建时而不是在运行时生成和注入代理。但是有些人不喜欢使用编译器扩展,所以我加入了其他选项。旁注;MS应该购买PostSharp的权限,并将其构建到标准编译器中!:)与PostSharp的合作是一个问题。它不想与System.Data.SQLite交互:说程序集不兼容。这不是@rally25rs建议的吗?几乎是。我不太清楚如何使用DynamicProxy,但EasyProp帮助了我。
public static void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
Console.WriteLine("Property Changed: " + propertyChangedEventArgs.PropertyName);
}