所以你想創建一個包含其他類的類。
這裏是你可以做什麼:
- 通過
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或任何其他閱讀代碼自動對象創建框架。我只希望它能幫助你找到正確的方向。
好像你有這個過程 - 卡在哪裏? – 2014-09-24 12:46:37
問題在哪裏? – HimBromBeere 2014-09-24 12:49:28
您是否遇到異常?我假設,因爲你沒有問,'CreateInstance'正在拋出某種錯誤。 – 2014-09-24 13:01:29