XML'e/nesnesinden nesneleri serileştirmek ve serileştirmek için var olan bir sınıfa sahibim. Tek kısıtlama T
olan ve tek kısıtlaması where T : IXmlSerializable
olan genel bir sınıftır. Ancak, hala bu sınıfı IXmlSerializable
'u uygulamayan ancak [Serializable]
özniteliğine sahip sınıflarda kullanmak istiyorum. Bunu yapmayı nasıl başarabilirim? Benim genel sınıfındanC# genel seri hale getirme yardımcı programı sınıfı
:
public static class XmlSerializationUtils<T> where T : IXmlSerializable
{
public static T DeserializeXml(XmlDocument xml) { ... }
public static XmlDocument SerializeToXml(T toSerialize) { ... }
}
Ben this discussion buldum ama verilen hiçbir çözüm ben where T : Serializable
yapamaz sadece vardı. where T : SerializableAttribute
yapmayı denediğinde, Visual Studio'nun "Serial sınıf" System.SerializableAttribute 'tür parametre kısıtlaması olarak kullanılamıyor "olduğunu söylüyor.
Düzenleme:Stephen's answer dayalı, ben XmlSerializationUtils<T>
üzerinde kısıtlamalar kaldırılmış ve bu statik yapıcı ekledi: Sen jenerik bir parçası olarak bir özelliğin gerekli edemez
static XmlSerializationUtils()
{
Type type = typeof(T);
bool hasAttribute = null != Attribute.GetCustomAttribute(type,
typeof(SerializableAttribute));
bool implementsInterface =
null != type.GetInterface(typeof(IXmlSerializable).FullName);
if (!hasAttribute && !implementsInterface)
{
throw new ArgumentException(
"Cannot use XmlSerializationUtils on class " + type.Name +
" because it does not have the Serializable attribute " +
" and it does not implement IXmlSerializable"
);
}
}
Bu mantıksız bir çözüm değil. –
Evet, katılıyorum sınıfının serileştirmeye çalışıp çalışmadığını öğrenmek isteyen bir geliştirici tarafından kullanılıyor, eğer istisnaların ne olduğu yanlışsa, derleme zamanında her olası hatayı ortadan kaldıramazsınız. –
@Ben: Her zaman bunu yapamayız, ancak hataları erken ve sık sık yakalamaya çalışmalıyız. Bu durumda, derleme zamanında yakalayamayız, ancak statik kurucu hilesi kullanırsak, onu çalışma zamanının en başında yakalayabiliriz (bu, derleme sonrası bir duman kontrolü bunu kaçırmaz). –