4

我正在使用该CreateClassProxyWithTarget方法装饰现有对象。但是,构造函数和初始化代码被调用了两次。我已经有一个“构造”实例(目标)。我理解为什么会发生这种情况,但是除了使用空的构造函数之外,有没有办法避免它?

编辑:这是一些代码:

首先创建代理:

public static T Create<T>(T i_pEntity) where T : class
{
  object pResult = m_pGenerator.CreateClassProxyWithTarget(typeof(T),
                                                           new[] 
                                                             { 
                                                                typeof(IEditableObject),
                                                                typeof(INotifyPropertyChanged) ,
                                                                typeof(IMarkerInterface),
                                                                typeof(IDataErrorInfo)
                                                             },                                                               
                                                           i_pEntity,
                                                           ProxyGenerationOptions.Default,
                                                           new BindingEntityInterceptor<T>(i_pEntity));
  return (T)pResult;
}

例如,我将它与以下类的对象一起使用:

public class KatalogBase : AuditableBaseEntity
{
   public KatalogBase()
   {
     Values     = new HashedSet<Values>();
     Attributes = new HashedSet<Attributes>();
   }
   ...
}

如果我现在调用BindingFactory.Create(someKatalogBaseObject);和 属性正在重新初始化。ValuesAttributes

4

2 回答 2

2

根据Krzysztof 的一篇文章和他在 Moq 论坛上的评论,我设法让这个工作:

 class MyProxyGenerator : ProxyGenerator
    {
        public object CreateClassProxyWithoutRunningCtor(Type type, ProxyGenerationOptions pgo, SourcererInterceptor sourcererInterceptor)
        {
            var prxType = this.CreateClassProxyType(type, new Type[] { }, pgo);
            var instance = FormatterServices.GetUninitializedObject(prxType);
            SetInterceptors(instance, new IInterceptor[]{sourcererInterceptor});
            return instance;
        }


        private void SetInterceptors(object proxy, params IInterceptor[] interceptors)
        {
            var field = proxy.GetType().GetField("__interceptors");
            field.SetValue(proxy, interceptors);
        }


    }
于 2012-10-28T20:11:48.157 回答
0

那么您要问的是 DynamicProxy 是否可以在不调用其构造函数的情况下构造代理实例?

那是不可能的。有一种使用方法,FormatterServices.GetUninitializedObject()但在中等信任下不起作用。

于 2012-07-01T03:11:46.207 回答