{
"Result" : 0
, "ResultCnt": 2
, "Data": [
{ "AAAAA":1,"BBBBB":"2019/01/01","CCCCC":"ABCDE"}
, { "AAAAA":1,"BBBBB":"2019/01/01","CCCCC":"ABCDE"}
]
}
上記のjsonをDataTableに格納したいと思い、以下の処理を行いました。
lang
1 // ① 2 // デシリアライズ 3 var resData = (ClsXXXXXX)JsonDeserializer(resJson, typeof(ClsXXXXXX)); 4 5 // ② 6 // TestClassクラスのTypeオブジェクトを取得する 7 Type t = typeof(ClsXXXXXX); 8 9 // メソッドの一覧を取得する 10 PropertyInfo [] properties = t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 11 foreach (PropertyInfo p in properties) 12 { 13 dt.Columns.Add(new DataColumn(p.Name)); 14 } 15 16 // 値設定 17 for (int i = 0; i < resData.Data.Count; i++) 18 { 19 DataRow row = dt.NewRow(); 20 foreach (PropertyInfo p in properties) 21 { 22 // データテーブルに値を設定 23 row[p.Name] = p.GetValue(resData.Data[i]); 24 } 25 // 行追加 26 dt.Rows.Add(row); 27 }
上記はうまく動いているのですが、jsonのDataの部分は複数フォーマットあり、ClsXXXXXX を動的に変更したく、②以降を関数としたいのですがうまくできません。
構文エラーとなる箇所について、どのように記述すればよいかお教え願えませんでしょうか。
var resData = (ClsXXXXXX)JsonDeserializer(resJson, typeof(ClsXXXXXX));
resDataを引数(data)として渡す↓
lang
1 public DataTable SetDataTable(Object data) 2 { 3 // 戻り値用 4 DataTable dt = new DataTable(); 5 6 //TestClassクラスのTypeオブジェクトを取得する 7 Type t = data.GetType(); 8 9 //メソッドの一覧を取得する 10 PropertyInfo[] properties = t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); 11 foreach (PropertyInfo p in properties) 12 { 13 dt.Columns.Add(new DataColumn(p.Name)); 14 } 15 16 // 値設定 17 for (int i = 0; i < data.Data.Count; i++) // data.Data が構文エラーとなる 18 { 19 DataRow row = dt.NewRow(); 20 foreach (PropertyInfo p in properties) 21 { 22 // データテーブルに値を設定 23 row[p.Name] = p.GetValue(data.Data[i]); // data.Data が構文エラーとなる 24 } 25 // 行追加 26 dt.Rows.Add(row); 27 } 28 29 // 戻り値 30 return dt; 31 }
そのClsXXXXたち(必ずDATAをもつ?)に共通の基底クラスか、DATAをもっていることを保証できるインターフェイスは実装していないということでしょうか?
コードがベタ書きで読みにくいので、マークダウンを利用してください。https://teratail.com/help
dodox86様
ご指摘ありがとうございます。
修正いたしました。
papinianus様
ご回答ありがとうございます。
ClsXXXXたちは必ずDATAを持っています。
DATAを持った基底クラスを作成し、継承したクラスの方でDATAをoverrideしようとしたのですが、型が違う為、できませんでした。
基底クラスのDATAは
List<Object> Data
継承したクラスのDATAは
List<ClsXXXXDATA> Data
回答をかきましたが、ClsXXXXDATAが、Dataプロパティをもっているというのは変(自分のクラスが自分のクラス型の配列を持つのでしょうか?)に思いました。resDataの型と、resDataのDataに入っている1要素の型に混同があるように思いました。
回答3件
あなたの回答
tips
プレビュー