linq to xml を介して xaml オブジェクト グラフの一部を抽出するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/45732

  •  09-06-2019
  •  | 
  •  

質問

xaml にシリアル化されたオブジェクト グラフがあります。大まかなサンプルは次のとおりです。

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

TheCollection 内のシリアル化されたオブジェクトを抽出するために Linq to XML を使用したいと考えています。

注記: MyObject 実行時に異なる名前が付けられる場合があります。私は、同じインターフェイスを実装するオブジェクトに興味があります。そのオブジェクトには、というパブリック コレクションがあります。 TheCollection の種類が含まれています IPolymorphicLol.

実行時にわかっていることは、コレクションを見つける深さと、コレクション要素の名前が ``*.TheCollection'' であることだけです。他のすべては変わります。

XML は、Linq を使用してデータベースから取得されます。両方のクエリを組み合わせることができれば、シリアル化されたグラフ全体を取得してからコレクション オブジェクトを抽出する代わりに、コレクションだけを取得できるので便利です。

役に立ちましたか?

解決

意思、

XAML を調べても、オブジェクトが何らかのインターフェイスを実装しているかどうかを確認することはできません。
制約を与えると、 という名前の子を持つ XML 要素を見つけることができます。

次のコードを使用できます。名前が で終わる子要素を持つすべての要素を返します。 。コレクション

    static IEnumerable<XElement> FindElement(XElement root)
    {
        foreach (var element in root.Elements())
        {
            if (element.Name.LocalName.EndsWith(".TheCollection"))
            {
                yield return element.Parent;
            }
            foreach (var subElement in FindElement(element))
            {
                yield return subElement;
            }
        }
    }

この要素で表されるオブジェクトが何らかのインターフェイスを実装していることを確認するには、アセンブリからメタデータを読み取る必要があります。リフレクションを使用せずにアセンブリ内の型を分析するには、Mono.Cecil フレームワークを使用することをお勧めします。

他のヒント

@あく
はい、xaml には基本型やインターフェイスの表示が含まれていないことはわかっています。しかし、ルート オブジェクトのインターフェイスと、コレクションがコンパイル時に保持するインターフェイスは知っています。

シリアル化されたグラフは SQL データベースに XML として保存され、linq を使用して XElement として取得します。現在、あなたのソリューションに従って、グラフを逆シリアル化し、グラフを反復処理し、コレクションから必要なオブジェクトを取り出し、それらへのすべての参照を削除して、その親を破棄することに制限されています。それはすべて非常に厄介です。私は一筆書きの解決策を望んでいました。xpath に沿ったものですが、探している要素だけを返す linq to sql クエリとインラインです...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top