2016-04-07 6 views
1

XMLファイルからObservableCollectionに総称して追加するメソッドを作成する際に、すべてのレコードが最後に読み込まれます。XMLファイルからObservableCollectionを一般的に取り込む

複数のXMLファイルを複数のObservableCollectionにロードする必要があります。これはまっすぐなものですが、Classes以降の複数のものに基づいてこれらのObservableCollectionが追加されます。また、Classesの変更はXMLの読み取りに反映される必要があります。だから私はObservableCollection<object>ジェネリックを返すメソッドを持つことでこれを解決すると考えました。メソッドが呼び出されると、ObservableCollectionClassがこのようなものをキャストします。

MyClass c = new MyClass(); 
GetXMLData(c); 

各XElementのメソッドでは、それぞれのプロパティを次のように設定します。

public ObservableCollection<object> GetXMLData(object value) 
{ 
    string fName = "MyPath"; 
    ObservableCollection<object> tableData = new ObservableCollection<object>(); 
    FileStream fs = new FileStream(fName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
    { 
     XDocument fileXML = XDocument.Load(fs); 
     var dataXML = 
      from x in fileXML.Descendants("MyData") 
      select x; 
     foreach (XElement x in dataXML) 
     { 
      var data = (object)value; 
      foreach (var prop in value.GetType().GetProperties()) 
      { 
        PropertyInfo propertyInfo = data.GetType().GetProperty(prop.Name); 
        propertyInfo.SetValue(data, Convert.ChangeType(x.Attribute(prop.Name).Value, propertyInfo.PropertyType), null); 
      } 
      tableData.Add(data); 
     } 
    } 
    return tableData; 
} 

この種の機能はありますが、問題はあります。私は値のデータをキャストしているので、すべてのレコードtableDataは最後に読み取られたレコードです。

セイXMLデータは次のようになります。

<Item Field1="Bob" Field2="10" /> 
<Item Field1="Mike" Field2="20" /> 
<Item Field1="Sam" Field2="30" /> 

あなたはObservableCollection<object>を見ればあなたがこの参照してください。代わりにこれを見ての

Field1="Sam", Field2="30" 
Field1="Sam", Field2="30" 
Field1="Sam", Field2="30" 

Field1="Bob", Field2="10" 
Field1="Mike" Field2="20" 
Field1="Sam" Field2="30" 

注:

  1. 私はそこにない不良データを処理するエラーのロジックを持っています。私の質問を明らかにすることを試みた:。だから、あなたが安全に、クラス

編集のための完璧なXMLファイルの試合の属性があることを前提とすることができます

  • ことを無視申し訳ありませんが、私はちょうどあなたがこれをやってね!

  • +1

    * *あなたの質問は何ですか?私は特定の質問がここで尋ねられるのを見ない。 – GEEF

    +0

    @GEEF質問を見てください、私はちょうど質問をより明確に述べます。 – Xaphann

    答えて

    1

    あなたのループ内のdataのインスタンスはすべて、実際にはvalueへの参照です。それらは「新しい」オブジェクトではありません。ですから、各ループで何をしているのかは、valueのプロパティを変更することです。これはあなたが望むものではないと確信しています。 Debug.WriteLine(value)の場合は、繰り返しごとに何を意味するのかがわかります。したがって、3つのdataインスタンスとvalueはすべて常に同じです。 valueのタイプがわかっている場合は、新しいのインスタンスを作成し、それに応じてプロパティを設定する必要があります。型が引数のないpublicコンストラクタを持っていると仮定します:

    var data = Activator.CreateInstance(value.GetType()); 
    

    ...あなたはあなたを始めます。

    +0

    ありがとうございます!私はなぜそれが起こっていたが、Activator.CreateInstanceキーを理解した。私が試していたすべてのもの.GetType()は機能しませんでした。 – Xaphann

    +0

    ええと - それはこの種のもののための魔法の弾丸です;-) – Clay

    関連する問題