Yazmak istediğim bir serileştiricinin bir parçası olarak (zıt için birinden kaçınarak), zıt karşıt dönüşümü (türden dize) yapmam gerekiyordu. Deserialize ediyordum ve bu konu hakkında konuşmak için tek yazıydı, bu yüzden hala taze iken cevabımla güncelleniyorum.
Kullandığım yöntem, temel olarak ne yapmam gerektiğini öğrenmek için yansıma kullanmaktı. Aşağıdaki örnekte bulunan değişken türü, dönüştürdüğüm türün Type nesnesidir, E içeriği için hangi dönüştürücüyü dönüştüreceğimiz bir XmlNode ve newVar, döneceğimiz bir şablon T türünün bir örneğidir. Bu fragman ve nesneler/çeteleler farklı şekilde ele varsayar (orada hiçbir doğrudan dize atama/dökme neden olan) T üzerinde herhangi kısıtlamaları kabul etmez (nesneler ve çeteleler kırmak):
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("To" + type.Name);
else
convertMethod = E.InnerText.GetType().GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
if(Type.GetTypeCode (type)!= TypeCode.String)
newVar = (T)convertMethod.Invoke(null, new object[] { E.InnerText });
else
newVar = (T)convertMethod.Invoke (E.InnerText, new object[]{});
}
(Dize işlenmesi gereken ToString() gibi özel bir durum olarak tamamen farklı bir şey yapar ve her şeyi bozar).
(orijinal yazı uyarınca) tersi (Ben serialize işlevini yazarsanız, güncelleyecektir test edilmemiş) gibi bir şey olacaktır:
MethodInfo convertMethod;
if(Type.GetTypeCode(type) != TypeCode.String)
convertMethod = typeof(XmlConvert).GetMethod ("ToString", new Type[] {typeof(T)});
else
convertMethod = typeof(string).GetMethod("Clone");
if(convertMethod == null)
{
//Error
}
else
{
string str;
if(Type.GetTypeCode (type)!= TypeCode.String)
str = (string)convertMethod.Invoke(null, new object[] { Value });
else
str = (string)convertMethod.Invoke (Value, new object[]{});
}
Bu durumda, dönüşüm T den dize etmektir ve Değer, dönüştürdüğümüz bir T türü içerir. Aradaki fark, ToString'i istediğimiz, ancak T parametresinin bir parametresiyle fonksiyonu belirtmemizdir. Bu, yeterince benzersiz olmalıdır.
Başlarım için minnettarım ama XmlSerializer, DataContractSerializer cehennemden geçtim. XamlWriter ile oynadım bile. Değerlerim kutlanıyor, çünkü birçok veri türü ile ilgilenen bir Arabirim aracılığıyla onlara erişiyorum. –