Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.Net Framework中将方法注入自动属性_C#_Reflection_.net 2.0 - Fatal编程技术网

C# 如何在.Net Framework中将方法注入自动属性

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

我有一些具有许多属性的类Foo:

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