linq to xml を介して xaml オブジェクト グラフの一部を抽出するにはどうすればよいですか?
-
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 クエリとインラインです...