c# – 如何避免使用DynamicProxy :: CreateClassProxyWithTarget双重构造代理?

我正在使用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);价值观和属性
属性再次初始化.

最佳答案 在Moq论坛上以
one of Krzysztof’s articles和他的
comment为基础,我设法让这个工作:

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


    }
点赞