2009-12-01 22 views
9

Bu sorunun başlığına baktığımda, ne yapmak istediğimi belirtmek mümkün olmayabilir, bu yüzden ne yaptığımı açıklayacağım ve ne olduğumu bana bildirmekten çekinmeyin. yanlış yapmak ve amacımı gerçekleştirmek için daha iyi bir yol ne olurdu.C# Yansımayı Kullanarak Çalışma Zamanında Döküm Tipi

1) bir temel türden türetilmiş özel bir nesne ve 2) iç alan adlarını ve ilişkili değerleri açıklayan bir XML dosyasına sahibim. Bu türetilmiş nesneler, temel sınıfın bilmediği ek alanlara sahip olabilir.

Nesne türünü bir dize olarak ayıkladım ve tüm nesne verilerini, anahtarın alan adı olduğu ve değerin alanın değeri olduğu bir sözlük içerisine yerleştirdim. Nesneyi dize adını ve nesnenin varsayılan yapıcısını kullanarak başlatırım. Tüm nesnenin özelliklerini bir PropertyInfo [] içine koklayabilirim. Şimdi dize formundaki tüm değerleri almalı ve bunları doğru veri tiplerine dönüştürmeliyim, böylece bunları nesnenin özelliklerine yükleyebilirim. (Bunu yazarken, bir tür kayıt durumu alıp geri yüklediğime benziyor, ama sadece bu tür şeyleri duymuştum. Bu satırlar boyunca tavsiyede bulunmak isterseniz lütfen aklınızda bulundurun. Ben bir XML dosyasından veri okumaya takılıyorum ve bunu değiştiremiyorum.)

Tüm dize değerlerini, Tür Nesnesi tarafından verilmiş bir türe dönüştürebilir ve yaptığım bir kaba kuvvet işlevini kullanabilirim

public object convertMe(string v, Type t) 

ben işlevi de atıyorum Tip, geri geliyor bilmiyorum ve ben açıkça 012 döküm alamıyorum bilmiyorum beri: aşağıdaki tanım sahipnesnesi, yukarıda belirtilen özelliğe atama için uygun türden . Ben boşuna atmalarını aşağıdaki tür teşebbüs edilmiştir:

string objectType = /*read type string from XML*/; 

... // Wherein I instantiate an object "theObject" and get PropertyInfo[] from it. 
... // I also make sure that I'm trying to assign the correct data to 
... // the correct property. 

Type t = currentProperty.PropertyType; 
object o = convertMe(value, Type.GetType(qtype)); 
currentProperty.SetValue(theObject, (t)o, null); // Doesn't work 
currentProperty.SetValue(theObject, (t)Convert.ChangeType(o, t), null); // Doesn't work. Apparently (t) is bad syntax. 

Sonuçta, amacım nesnesinin bir örneğini oluşturmak ve veri türleri olmadığına karar şekilde XML dosyasından verilerle yüklemektir kodlanmış. Bunu C# içinde yapmamın nedeni, bunun bir Python programı olması ve C# .NET 2.0'a çevirmek için atanmış olmasından kaynaklanmaktadır. En azını söyleyen bir öğrenme deneyimi. Bu "kaba kuvvet işlevini" yaratmamın nedeni, bu döküm probleminin bir yolunu aradığım için oldu, ama ne denediğime bakmadan işe yaramayacağım. Kendi başıma saf güç kullanarak bunu yapabilirim, ama eksik olduğum zarif bir çözüm olması gerektiğini düşündüm.

Herhangi bir yardım büyük beğeni topluyor!

cevap

14

Hiç bir oyuncuya ihtiyacınız yok. PropertyInfo.SetValue, object türünde bir argüman alır, bu yüzden o kodunu geçirin, ve bu o olacak.

+0

Ben de ölüyüm. Bunu kod körlüğüne kadar yazacağım.MSDN belgeleri bir nesne aldığını söylemesine rağmen, kullanımının her örneği uygun değer türünü kullandı, bu yüzden bu bağlantıyı hiç yapmadım. Çok teşekkürler! – Sanjamal

5

Oyunculuğa hiç ihtiyacınız yok. Döküm sadece yansımaları kullanırken değil, doğrudan nesnelerle uğraşırken faydalıdır.

Özelliği ayarladığınızda, PropertyInfo.SetValue kullanıyorsunuz. Bu, object değerini bir değer parametresi olarak alır, bu nedenle, belirli bir türe (bu, nesne zaten doğru tür olduğu sürece) zorlamaya çalışmanıza gerek yoktur.

Nesneyi doğru türüne (Object'a yerleştirilmiş veya kutulu) koyan bir "convertMe" yaptığınız için, her şey hazır demektir - sadece onu kullanın.

+0

Size de teşekkürler! – Sanjamal

İlgili konular