###質問
通信などの理由でstringと相互に変換できる通信データクラスの仕組みを考えています。
stringにする仕組みはできたのですが、stringをクラスインスタンスにデシリアライズする仕組みが思いつきません。
C#
1Namespace Somewhere 2{ 3 public interface ITsushinSupporting 4 { 5 string AsString(); 6 } 7} 8 9abstract class Data: Somewhere.ITsushinSupporting 10{ 11 public string AsString() 12 { 13 // GetTypeしてプロパティ値を名前順で全部とってきてstring化してカンマ区切りで結合する 14 // どんな派生クラスでもこれでstring化できる 15 } 16} 17 18class DataA: Data 19{ 20 // プロパティが2つのPOCO 21} 22 23class DataB: Data 24{ 25 // プロパティが3つのPOCO 26}
ここでParseメソッドのような静的メソッドがDataクラスにほしいのですが、渡されたstringから元はどのクラスインスタンスだったのかが分からないことに気がつきました。
そこでDataクラスにTypeIdという抽象プロパティを実装し、その値をstring化するときに先頭にくるようにして、その値が一致する型にデシリアライズしようと考えました。
C#
1Namespace Somewhere 2{ 3 public interface ITsushinSupporting 4 { 5 string AsString(); 6 } 7} 8 9abstract class Data: Somewhere.ITsushinSupporting 10{ 11 propected abstract int TypeId{ get; } 12 13 public string AsString() 14 { 15 // GetTypeしてプロパティ値を名前順で全部とってきてstring化してカンマ区切りで結合する 16 // どんな派生クラスでもこれでstring化できる 17 // プロパティ値を名前順でとってくるとき、TypeIdだけは無条件で先頭に持ってくる 18 } 19 20 public Data Parse(string s) 21 { 22 // Dataクラスの派生クラスのうちTypeIdが一致するものを探してその型のインスタンスを作る 23 } 24} 25 26class DataA: Data 27{ 28 // プロパティが3つのPOCO 29 30 protected override int TypeId => 1; 31} 32 33class DataB: Data 34{ 35 // プロパティが4つのPOCO 36 37 protected override int TypeId => 2; 38}
しかし、この方法だとParseメソッド内をどのように実装すればいいか思いつきませんでした。
派生クラスを全て取得する方法も分かりませんし、TypeIdは実装上インスタンスプロパティですし、その型のTypeが取得できてもそのインスタンスを生成する方法が分かりません。
そもそも基底クラスの静的メソッドで派生クラスのインスタンスを生成したり、派生クラスはPOCOでなければならなかったり、結局通信で送られてきたデータをParseでクラスインスタンスに戻しても、利用する側ではif(...is DataB)といった分岐を行わなければなりませんし、それとTypeIdをpublicにしてswitchするのとどっちがいいのかもよくわかりません。
同じようなことをしたことがある方、いい方法を教えてください。
目的さえ果たせれば全然違う実装でも構いません。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。