【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というのがルートノードです。 こういうルートとかの参照を雑に注入するヘルパーを用意しました。

できたもの

↓コード
木構造にルートや親の参照を注入する。デシリアライズしたオブジェクトとかに使う

属性としてInjectRootInjectParentをつけた上で

class Node{
    public string id;
    public string[] dependencies;
    [InjectRoot]
    public Root root;
}

拡張メソッドのInjectRootやらInjectParentを呼ぶと諸々注入して返します.

var result = serializer.Deserialize(xmlText).InjectRoot().InjectParent();`

ルートでInjectParent指定したり,注入先の型が違う場合は例外出るのでご注意!