2014-09-24 89 views
-5

我想實例化完整的類。C#子類的實例不是在Reflection中創建的?

  1. 我有我想要實例化的類的類型。
  2. Activator.createInstance(type)我創建了實例。
  3. 我搜索了這個實例的所有字段。
  4. 我有一個在另一個程序集中定義的字段,所以我加載並實例化它。
  5. 我再次重複步驟3和4字段類(嵌套)
  6. 我創建每個類型的一個實例
//in a1.dll 
    class class1 
    { 
     class2 var1; 
     //some Method 
    } 

    //in a2.dll 
    class class2 
    { 
     class3 var2; 
     //some Method 
    } 

    //in a3.dll 
    class class3 
    { 
     //some Method 
    } 

我要創建整個class1類型的實例內部。

+4

好像你有這個過程 - 卡在哪裏? – 2014-09-24 12:46:37

+0

問題在哪裏? – HimBromBeere 2014-09-24 12:49:28

+0

您是否遇到異常?我假設,因爲你沒有問,'CreateInstance'正在拋出某種錯誤。 – 2014-09-24 13:01:29

回答

0

所以你想創建一個包含其他類的類。

這裏是你可以做什麼:

  • 通過Activator
  • 在目前的情況下,每個屬性和字段類型,通過調用你的方法創建一個類的實例,創建子實例和子實例分配給當前實例字段或屬性

下面的代碼可以幫助你開始對這個問題進行處理,但請仔細閱讀,還有v ERY要點下它:

public class A 
{ 
    public B MyBProperty { get; set; } 
    public C MyCField; 
} 

public class B 
{ 
    public C MyCField; 
} 

public class C 
{ 
} 

public class Creator 
{ 
    static MethodInfo mi; 

    static Creator() 
    { 
     mi = typeof(Creator).GetMethod("Create"); 
    } 

    public T Create<T>() 
    { 
      var createdType = Activator.CreateInstance<T>(); 

     // assign all properties 
     foreach (var p in typeof(T).GetProperties()) 
     { 
      try 
      { 
       var mig = mi.MakeGenericMethod(p.PropertyType); 
       p.SetValue(createdType, mig.Invoke(this, null)); 
      } 
      catch 
      { 
      } 
     } 

     // assign all fields 
     foreach (var f in typeof(T).GetFields()) 
     { 
      try 
      { 
       var mig = mi.MakeGenericMethod(f.FieldType); 
       f.SetValue(createdType, mig.Invoke(this, null)); 
      } 
      catch 
      { 
      } 
     } 

     return createdType; 
    } 
} 

// to use it: 
var c = new Creator(); 
var a = c.Create<A>(); // should be instantiated 

現在對於一些非常重要的點:此代碼應該幫助你看你如何開始

  • ,這是非常幼稚的
  • 它不檢查無限循環!
  • 它不緩存任何創建機制
  • 失敗,如果你的類不能被創建,例如,因爲它沒有參數的構造函數
  • 它靜靜地失敗
  • 不使用它!

有很多方法可以自動地創建對象,而這種代碼是了堅實的例子,僅僅是一個起點:如果你想知道更多,我會建議從Autofixture或任何其他閱讀代碼自動對象創建框架。我只希望它能幫助你找到正確的方向。