iT邦幫忙

0

把反序列化後的物件轉成class

我有一個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做得到嗎?)

石頭 iT邦高手 1 級 ‧ 2017-08-27 22:47:51 檢舉
請問一下 如果 amodel的型別是 AModel
那以下程式碼 會有矛盾吧?

if (obj.Name.EndsWith("bmodel"))
dgvJSON.DataSource = amodel.bmodel;
else if (obj.Name.EndsWith("cmodel"))
dgvJSON.DataSource = amodel.cmodel;

因為amodel.GetMembers(),一定會有這兩個成員變量amodel.bmodel 和 amodel.cmodel。
fillano iT邦超人 1 級 ‧ 2017-08-28 11:51:12 檢舉
reflection應該可以做到。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-09 09:34:10

可以使用反射來實現這一目標。
您可以枚舉 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;
    }
}

這樣,您就不需要在程式碼中指定特定的屬性名稱,因為程式碼會枚舉所有屬性並自動設置資料源。

我要發表回答

立即登入回答