0

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

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

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

:MyObject実行時に異なる名前が付けられる場合があります。TheCollectionの型を含むパブリック コレクションと呼ばれる同じインターフェイスを実装するオブジェクトに興味がありIPolymorphicLolます。

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

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

4

2 に答える 2

0

意思、

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

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

    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 フレームワークを使用してアセンブリ内の型を分析することをお勧めします。

于 2008-09-05T13:47:36.037 に答える
0

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

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

于 2008-09-05T15:21:09.150 に答える