2013-10-08 13 views
6

Dinamik olarak (codedom kullanarak) oluşturulan bir tür dizisi almak için XML'imi dizine ayırmaya çalışıyorum ve daha sonra bu montajı yüklemek için yansıma kullanıyorum ve yükleme türünü yüklemek istiyorum. dinamik olarak oluşturulur. XML'imi (bu dinamik olarak oluşturulmuş türde nesnelerin bir koleksiyonunu içeren) serileştirmeyi denediğimde, türü serileştiriciye nasıl vereceğimden emin değilim.Dinamik bir tür için seri hale getirme nasıl yapılır

Benim kod örneği:

 Assembly assembly = Assembly.LoadFile("myDynamicassembly.dll"); 
     Type type = assembly.GetType("myDynamicType"); 

     string xmlstring = myXml.OuterXml.ToString(); 
     byte[] buffer = ASCIIEncoding.UTF8.GetBytes(xmlstring); 
     MemoryStream ms = new MemoryStream(buffer); 
     XmlReader reader = new XmlTextReader(ms); 

     myDynamicType[] EQs; 
     XmlSerializer serializer = new XmlSerializer(typeof(myDynamicType[])); 
     EQs = (myDynamicType[])(serializer.Deserialize(reader)); 

Yani, burada sorun kod yazarken ben "myDynamicType" bilmiyorum olmasıdır. Çalışma zamanında oluşturulacak ve derlenecek.

Lütfen

Yardım edin.

+0

derleme zamanında türlerini biliyor musunuz sağa senin object[] EQs dönüştürmek için kazanılan Type kullanmak artık

 if(EQs.Lenght > 0) { Type t = EQs[0].GetType(); } 

ve:

Eğer object[] EQs bir kez dönüştürmek için bir başka yolu şudur Yine de, tamamen bilinmeyen montajları mı yüklüyorsunuz? Bu nesneleri nasıl kullanacaksınız? –

+0

Hayır, derleme zamanında türü bilmiyorum. Aslında, çalışma zamanında bir derleme oluşturulacak ve derlenecek. Yani, benim derlememin yanı sıra 'myDynamicType' bölümümün derleme zamanında tamamen bilinmediğini söyleyebilirsin. Daha fazla kullanım söz konusu olduğunda, bu diziyi bu koleksiyonda bir operasyon yürütecek olan web servisime ileteceğim. – tavier

cevap

8

Buradaki numara Type örneğinde Type.MakeArrayType() yöntemidir. Parametresiz sürüm, vektörü türünü, yani typeof(Foo).MakeArrayType() === typeof(Foo[]) üretir.

XmlSerializer serializer = new XmlSerializer(type.MakeArrayType()); 

Ancak çok boyutlu diziler vb diğer aşırı yükler vardır: değil sonunda döküm mümkün olacak;

EQs = (object[])(serializer.Deserialize(reader)); 
+0

Teşekkürler Marc. Ancak, eğer onu nesne haline getirirsem [] belirli bir türden bir koleksiyon beklediğini web servisine aktaramazdım. – tavier

+0

@AshishAgrawal Eğer tür dinamik olarak yüklenirse, orada zaten bir sorun var demektir. Temel olarak, nasıl yazdığınıza bakmadan, bu türden * bir türüdür. Eğer tür statik olarak biliniyorsa, açıkçası tüm bunlar anlamsızdır. –

+0

türü statik olarak tanımlanmamıştır. Aslında, dediğim gibi "myDynamicType" oluşturmak için codedom kullanıyorum. Dolayısıyla, bu dizi, kullanıcıdan gelen bazı girdilere göre değişecek olan değişkendir.Örneğin, kullanıcı bir Öğrenci sınıfı oluşturmak istediğimi söylüyorsa, kodum şunun gibi bir şeye dönüşecektir: Öğrenci [] EQs; XmlSerializer serializer = yeni XmlSerializer (typeof (Öğrenci [])); EQs = (Öğrenci []) (serializer.Deserialize (okuyucu)); Burada herhangi bir karışıklık yaratıyorsam lütfen bana bildirin. – tavier

0

ne ben söyleyeceğimi istediğini olup olmadığını bilmiyorum ama: Eğer (referans-tiplerinin dizisi varyansı kullanılarak) object[] veya benzeri kullanmanız gerekecektir

can' nesne tipi orada tanımlayan bir kod parçasıdır olmamalıdır (demek gibi) derleme zamanında tanımlanırsa, bir nesne türü

object[] EQs; 
XmlSerializer serializer = new XmlSerializer(typeof(object[])); 
EQs = (object[])(serializer.Deserialize(reader)); 

olarak serisini t? ve bu kod parçasında, nesneyi istediğiniz türe dönüştürürsünüz. Type

+1

"bir nesne türü olarak seri hale getiremezsiniz" - Hayır, temel olarak; 'XmlSerializer' ne beklemesi gerektiğini bilmelidir –

+0

@Vincent, aslında ben codedom kullanarak bu tür dinamik olarak (çalışma zamanında) oluşturuyorum. İşte, çalışma zamanında türünü aldığım kod (kullanıcının girdisine göre). Type type = assembly.GetType ("myDynamicType") yazın; Bu nedenle, myDynamicType statik olarak tanımlanmış bir tür değil. – tavier

+0

Yani ne tür olabilir? Bunun hakkında konuşabiliyor olmamız dizeler olabilirdi. Ya da özel clases olabilir. ve daha önemlisi, onunla bir şeyler hesaplamanız/yapman gerekiyor mu? Sadece bir ekranda bir ekran görüntülemek için xml yükleme için bir dize yeterli olacaktır. – Vincent

İlgili konular