C# DynamicProxy2:CreateClassProxyWithTarget+;接收器

C# DynamicProxy2:CreateClassProxyWithTarget+;接收器,c#,castle-dynamicproxy,iinterceptor,C#,Castle Dynamicproxy,Iinterceptor,如果我在另一个问题中遗漏了这一点,我道歉;我找了好一阵子才决定我有一个独特的问题。。。我想使用DynamicProxy 2为WPF应用程序的模型类提供拦截。这样我就不必在任何地方都完全实现INotifyPropertyChanged。例如,以下类在代理和拦截后应完全参与双向数据绑定: public class ModelExample : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyC

如果我在另一个问题中遗漏了这一点,我道歉;我找了好一阵子才决定我有一个独特的问题。。。我想使用DynamicProxy 2为WPF应用程序的模型类提供拦截。这样我就不必在任何地方都完全实现INotifyPropertyChanged。例如,以下类在代理和拦截后应完全参与双向数据绑定:

public class ModelExample : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public int Id{ get; set; }
    public string Uri{ get; set; }
    public string Name{ get; set; }
}
我发现我可以创建模型类的新实例,并通过调用CreateClassProxy方法来拦截对它的调用:

new ProxyGenerator().CreateClassProxy<T>(interceptors);
然而,当我这样做时,我的拦截器停止工作。我很确定这不是拦截器的错。。。这是一个非常简单的物体。这是它的界面:

public interface IFluentInterceptor : IInterceptor
{
    IFluentInterceptor Before(Action<IInvocation> before);
    IFluentInterceptor After(Action<IInvocation> after);
    IFluentInterceptor Finally(Action<IInvocation> @finally);
    IFluentInterceptor RunCondition(Func<IInvocation, bool> runCondition);
    IFluentInterceptor OnError(Func<IInvocation, Exception, bool> onError);
}
如果我尝试使用
CreateClassProxy
,它就像一个符咒。有人知道我做错了什么吗


谢谢

老实说,我认为这不是问题。如果我需要一个容器来为我生成
INotifyPropertyChanged
实现,它可能会出现在一些边缘情况下,我会插入容器生成的模型对象,因为它们具有依赖性等。在这些情况下
CreateClassProxy(拦截器)
是可以的。在所有其他情况下,我一直在使用MVVM ViewModels,其中围绕更改通知的确切逻辑是根据具体情况确定的,用户体验是重点。模型类通常会以某种方式被展平或变换,因此整个问题都没有意义。我问这个问题的时候,我不知道如何在我的应用程序中正确地利用MVVM,我想我将负责更多的活动部件。一旦我开始正确配置ViewModels,它实际上比预期的容易得多

public interface IFluentInterceptor : IInterceptor
{
    IFluentInterceptor Before(Action<IInvocation> before);
    IFluentInterceptor After(Action<IInvocation> after);
    IFluentInterceptor Finally(Action<IInvocation> @finally);
    IFluentInterceptor RunCondition(Func<IInvocation, bool> runCondition);
    IFluentInterceptor OnError(Func<IInvocation, Exception, bool> onError);
}
new ProxyGenerator().CreateClassProxyWithTarget(instance, new FluentInterceptor()
    .After(invocation =>
    {
        if (!invocation.Method.Name.StartsWith("set_")) return;
        string propertyName = invocation.Method.Name.Substring(4);
        FieldInfo info = invocation.TargetType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
            .Where(f => f.FieldType.Equals(typeof (PropertyChangedEventHandler)))
            .FirstOrDefault();
        if (info == null) return;
        var handler = info.GetValue(invocation.InvocationTarget) as PropertyChangedEventHandler;
        if (handler != null) handler.Invoke(invocation.TargetType, new PropertyChangedEventArgs(propertyName));
    }));