2016-04-07 26 views
1

XML dosyasından bir ObservableCollection dosyasına genel olarak eklemek için bir yöntem oluştururken, her kayıt sonuncudur.XML dosyasından gelen GözlemlenebilirKoleksiyon genel olarak

ben birden ObservableCollection içine birden XML dosyaları yüklemek gerekir. Bu yalındır yeterli, ancak bu ObservableCollection birden Classes kapalı tabanlı ve daha fazla mevcut Classes değişiklik XML dosyanın okunması yansıtılması olurdu bahsetmiyorum, eklenecektir. Bu yüzden, genel bir ObservableCollection<object> döndürecek bir yönteme sahip olmanın bunu çözeceğini düşünmüştüm. Yöntem çağrıldığında, ObservableCollection'un Class10'u böyle bir şey yapar;

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

Daha sonra, her bir XElement Yöntemi için her Mülk değerini şöyle ayarlayacağım;

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; 
} 

Bu tür işler ancak bir sorun var. Ben değeri hakkında veri döküm am beri her kayıt tableData son rekor okunur.

Say XML veri şuna benzer:

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

Eğer ObservableCollection<object> bakarsak Bunu görmek:

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

yerine bu görme:

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

Notlar:

  1. Orada olmayan hatalı verileri ele alma hatası için mantığım var. Yani
  2. güvenle Sınıf

düzenlemek için mükemmel XML dosyası maçın niteliklerini varsayabiliriz olduğunu görmezden: sorumu aydınlatmaya çalıştı. Üzgünüm sadece ne yapmadığımı göstermek istedi "Hey nasıl yapıyorsun?"

+1

* tam * Sorunuz nedir? Burada sorulan belirli bir soru göremiyorum. – GEEF

+0

@GEEF Lütfen soruya daha açık bir şekilde değindim. – Xaphann

cevap

1

Kuyu döngüsündeki tüm data örneklerinin tümü, value'a başvuruyor. Onlar "yeni" nesneler değiller. Yani, her döngüde yaptığınız şey, istediğiniz gibi olmadığına emin olduğum value'un özelliklerini değiştiriyor. Her yinelemede Debug.WriteLine(value) ise, ne demek istediğimi görürsünüz. Yani, her üç data örneğinin ve value her zaman aynı olacaktır. Eğer value türü ne biliyorsanız,, bunun yeni örneklerini oluşturmak buna göre özellikleri var belirlesin.

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

... başlamak istiyorum: Size türünü varsayarsak olmayan bir argüman public kurucu sahiptir.

+0

Çok teşekkür ederim! Neden olduğunu anladım ama Activator.CreateInstance. Etrafında denediğim her şey.GetType() çalışma değildi. – Xaphann

+0

Yup - Bu tür bir şey için sihirli mermi ;-) – Clay

İlgili konular