4

CreateClassProxyWithTargetメソッドを使用して既存のオブジェクトを装飾しています。ただし、コンストラクター、つまり初期化コードが 2 回呼び出されています。私はすでに「構築された」インスタンス(ターゲット)を持っています。なぜこれが起こるのか理解していますが、空のコンストラクターを使用する以外に回避する方法はありますか?

編集:ここにいくつかのコードがあります:

最初にプロキシを作成します:

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 の記事の 1 つと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 に答える