我有一個class , 裡面包了N個小class。我在A程式把這個物件序列化,存成一個file。然後用B程式讀出這個file, 做反序列化。現在我卡在一個問題,我要用什麼方法,可以把這個反序列化後的物件,個別取出這N個小class? 用程式碼解釋一下我的問題:
我的class
public class AModel
{
public List<BModel> bmodel { get; set; }
public List<CModel> cmodel { get; set; }
}
public class BModel
{
public string field1 { get; set; }
public string field2 { get; set; }
}
public class CModel
{
public string field1 { get; set; }
public string field2 { get; set; }
}
在A程式,將AModel 做序列化,存成檔案。在B程式,讀出檔案,做反序列化,然後用一個變數接收:(底下只show B程式的處理)
AModel amodel = new AModel;
...(省略讀檔案的程式)...
amodel = (AModel)deseralizer.ReadObject(ms); //ms 是MemoryStream
再來,我做了以下嘗試:
//dgvJSON 是 WindowsForm 的 DataGridView
var myTypeObj = amodel.GetType();
foreach (var obj in myTypeObj.GetMembers())
{
DataGridView dgvJSON = new DataGridView();
dgvJSON.AutoGenerateColumns = true;
if (obj.Name.EndsWith("bmodel"))
dgvJSON.DataSource = amodel.bmodel;
else if (obj.Name.EndsWith("cmodel"))
dgvJSON.DataSource = amodel.cmodel;
}
這樣的寫法是OK的,可以將子class的內容完整的show在 DataGridView.
不過我覺得這樣的寫法有點不smart,必須先知道每個class的名字,hardcode在程式裡。
有什麼方法可以不用事先知道每個class的名字,又能把class還原回來?(例如reflection做得到嗎?)
可以使用反射來實現這一目標。
您可以枚舉 AModel 對像中的所有屬性,並在每個屬性上執行反射。
如果該屬性是一個 List,則可以將其賦值給 DataGridView 的資料源。
// 創建 DataGridView 對象
DataGridView dgvJSON = new DataGridView();
// 自動生成列
dgvJSON.AutoGenerateColumns = true;
// 獲取 AModel 類型
var type = amodel.GetType();
// 獲取 AModel 類型的所有屬性
var properties = type.GetProperties();
// 枚舉 AModel 類型的所有屬性
foreach (var property in properties)
{
// 獲取當前屬性的值
var propertyValue = property.GetValue(amodel, null);
// 如果當前屬性的值是 IEnumerable 類型
if (propertyValue is IEnumerable)
{
// 將資料源設置為當前屬性的值
dgvJSON.DataSource = propertyValue;
}
}
這樣,您就不需要在程式碼中指定特定的屬性名稱,因為程式碼會枚舉所有屬性並自動設置資料源。