如果我在另一个问题中错过了这一点,我深表歉意;在决定我有一个独特的问题之前,我找了好久......我想使用 DynamicProxy2 为 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);
不幸的是,这迫使我允许ProxyGenerator
该类创建我的模型实例,而我正在从中间层取回这些实例,即它们已经存在。我需要包装现有对象,所以我想我需要调用CreateClassProxyWithTarget
:
new ProxyGenerator().CreateClassProxyWithTarget(instance, 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);
}
该FluentInterceptor
类型实现了这一点。, Before
,After
等方法过于简单,无法展示;它们都添加到要在方法调用期间使用的操作队列中,然后每个方法都返回this
,从而允许方法链接。
下面的代码不起作用,但我不知道为什么:
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));
}));
如果我尝试使用CreateClassProxy
,它就像一个魅力。有人看到我做错了吗?
谢谢!