2017-01-03 13 views
0

コンストラクタを構築することは容易ではありません。コンストラクタを構築する方法

私は次のようにコード

public class Sample 
{   

    public Sample Parent { get; set; }  
    public Sample(Sample parent) 
    { 
     Parent = parent; 
     Children = new ObservableTestCollection<Sample>(this); 
    }  
    public Sample(Sample parent, IEnumerable<Sample> source) 
    { 
     Parent = parent; 
     Children = new ObservableTestCollection<Sample>(this, source); 
    }    
    public ObservableTestCollection<Sample> Children { get; set; } 
} 

そしてObservableTestCollectionの源の第二のコンストラクタを作成しようとしています:

public class ObservableTestCollection<T> : ObservableCollection<T> 
{ 
    public T Parent; 
    public ObservableTestCollection(T parent):this(parent, Enumerable.Empty<T>()) 
    {   
    } 
    public ObservableTestCollection(T parent, IEnumerable<T> source): base(source) 
    { 
     Parent = parent; 
    } 
} 

そして、次のように私が書いたコンストラクタビルダーは、次のとおりです。

 //first constructor   
     var obsCtor1 = typeOfCts.GetConstructors().First(c => c.GetParameters().Length == 1); 
     obsCtor1 = TypeBuilder.GetConstructor(genericTypeOfCts, obsCtor1); 
     var constructorParameters = new Type[] { typeBuilder }; 
     var ctorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, constructorParameters); 
     il = ctorBuilder.GetILGenerator(); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_1); 
     il.Emit(OpCodes.Call, setParentMethod); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Newobj, obsCtor1); 
     il.Emit(OpCodes.Call, setChildrenMethod); 
     il.Emit(OpCodes.Ret); 


     //second constructor 
      var obsCtor2 = typeOfCts.GetConstructors().First(c => c.GetParameters().Length == 2); 
     obsCtor2 = TypeBuilder.GetConstructor(genericTypeOfCts, obsCtor2); 
     var ctorParam = typeOfCts.MakeGenericType(typeBuilder);   
     constructorParameters = new Type[] { typeBuilder, ctorParam };   
     ctorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, constructorParameters); 
     il = ctorBuilder.GetILGenerator(); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_1); 
     il.Emit(OpCodes.Call, setParentMethod); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_0); 
     il.Emit(OpCodes.Ldarg_2); 
     il.Emit(OpCodes.Newobj, obsCtor2); 
     il.Emit(OpCodes.Call, setChildrenMethod); 
     il.Emit(OpCodes.Ret); 

     Type type = typeBuilder.CreateType(); 
     var obj1 = Activator.CreateInstance(type, new object[] { null }); 
     var obj2 = Activator.CreateInstance(type, obj1); 
     assemblyBuilder.Save(assemblyFileName); 

     var children = (IList)obj2.GetType().GetProperty(selfRefDerivedCollectionName).GetValue(obj2, null); 
     ((INotifyCollectionChanged)children).CollectionChanged += Program_CollectionChanged; 

     var obj3 = Activator.CreateInstance(type, new object[] { null }); 
     children.Add(obj3); 


     var listOf = typeof(List<>); 
     var listOfType = listOf.MakeGenericType(type); 
     var list =(IList) Activator.CreateInstance(listOfType); 
     obj1 = Activator.CreateInstance(type, new object[] { null }); 
     list.Add(obj1); 
     obj1 = Activator.CreateInstance(type, new object[] { null }); 
     list.Add(obj1); 
     var obj4 = Activator.CreateInstance(type, list); 

誰かが私のコードに何が間違っているかを知るのに手伝ってもらえますか?

+0

は、あなたがあなたのC#の例のILを与える反射型のツールを使用したことがありますか? – RQDQ

+0

私はILDASMを使用しましたが、他のツールはまだありません。何か心に留めていますか? –

+0

Telerik JustDecompile:http://www.telerik.com/products/decompiler.aspxを使用しますが、他にも良い選択肢があると確信しています。 – RQDQ

答えて

0

私はこの問題は、第二のコンストラクタを構築していないことがわかったが、ジェネリック型のインスタンスを作成していました。

次のように私は更新:

 Type type = typeBuilder.CreateType(); 
     var obj1 = Activator.CreateInstance(type, new object[] { null }); 
     var obj2 = Activator.CreateInstance(type, obj1); 
     assemblyBuilder.Save(assemblyFileName); 

     var children = (IList)obj2.GetType().GetProperty(selfRefDerivedCollectionName).GetValue(obj2, null); 
     ((INotifyCollectionChanged)children).CollectionChanged += Program_CollectionChanged; 

     var obj3 = Activator.CreateInstance(type, new object[] { null }); 
     children.Add(obj3); 

     var genericType = typeOfCts.MakeGenericType(type); 


     var list = Activator.CreateInstance(genericType, new object[] { null}); 
     obj1 = Activator.CreateInstance(type, new object[] { null }); 

     list.GetType().GetMethod("Add").Invoke(list, new object[] { obj1 }); 


     obj1 = Activator.CreateInstance(type, new object[] { null }); 
     list.GetType().GetMethod("Add").Invoke(list, new object[] { obj1 }); 

     var obj4 = Activator.CreateInstance(type, new object[] { null, list }); 
関連する問題