【C#】木構造の中のフィールドに親やルートの参照を注入する
XMLのデシリアライズ等で得られた木構造を解析する際、あるノードから親やルートを見たくなることありませんか…?
例えばこういう木構造があったとして、 あるNodeが別のNodeへの参照を持ってますが直シリアライズではなくidを持ってる形とか考えられます。
class Node{ public string id; public string[] dependencies; } class Root{ public Node[] nodes; }
Nodeにこういうメソッドかプロパティを生やしたいですね
public IEnumerable<Node> Dependencies => dependencies.Select(dep => root.nodes.FirstOrDefault(n => n.id == dep));
ここで突然お出ししたroot
というのがルートノードです。
こういうルートとかの参照を雑に注入するヘルパーを用意しました。
できたもの
↓コード
木構造にルートや親の参照を注入する。デシリアライズしたオブジェクトとかに使う
属性としてInjectRoot
かInjectParent
をつけた上で
class Node{ public string id; public string[] dependencies; [InjectRoot] public Root root; }
拡張メソッドのInjectRoot
やらInjectParent
を呼ぶと諸々注入して返します.
var result = serializer.Deserialize(xmlText).InjectRoot().InjectParent();`
ルートでInjectParent指定したり,注入先の型が違う場合は例外出るのでご注意!