2008-09-05 24 views
0

私はxamlにシリアル化されたオブジェクトグラフを持っています。それは、TheCollection内のシリアル化されたオブジェクトを抽出するためにLinq to XMLを使いたいと思います。linqからxmlにxamlオブジェクトグラフの一部を抽出するにはどうすればよいですか?

MyObject、実行時に別の名前にすることもでき、私はIPolymorphicLolのタイプを含むTheCollectionというパブリックコレクションを持つ同じインターフェイスを実装するオブジェクトに興味があります。

私が実行時に知っている唯一のものは、コレクションを見つける深さとコレクション要素の名前が「* .TheCollection`です。それ以外は変わります。

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

答えて

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フレームワークを使用することをお勧めします。

0

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

シリアル化されたグラフはSQLデータベースにXMLとして格納されており、linqを使用してXElementsとして取得しています。現在のところ、あなたのソリューションに加えて、グラフをデシリアライズし、それらを繰り返し、コレクションから必要なオブジェクトを引き出し、それらの参照をすべて削除してから、親を破棄することに限定しています。そのすべて非常にクルージング。私は一筆一筆のソリューションを望んでいた。 xpathの行に沿ったものですが、私たちが探している要素だけを返すSQLのlinqとのインライン展開...

関連する問題