c# - studio - reference datacontract
¿Cómo averiguar si la clase tiene el atributo DataContract? (4)
Estoy escribiendo una función de serialización que necesita determinar si la clase tiene el atributo DataContract. Básicamente, la función usará DataContractSerializer si la clase tiene el atributo DataContract, de lo contrario usará XmlSerializer.
¡Gracias por tu ayuda!
La forma más sencilla de probar DataContractAttribute es probablemente:
bool f = Attribute.IsDefined(typeof(T), typeof(DataContractAttribute));
Dicho esto, ahora que DC admite la serialización de POCO, no está completo. Una prueba más completa para la serialización de CC sería:
bool f = true;
try {
new DataContractSerializer(typeof(T));
}
catch (DataContractException) {
f = false;
}
Pruebe algo como:
object o = this.GetType().GetCustomAttributes(true).ToList().FirstOrDefault(e => e is DataContractAttribute);
bool hasDataContractAttribute = (o != null);
bool hasDataContractAttribute = typeof(YourType)
.GetCustomAttributes(typeof(DataContractAttribute), true).Any();
Descubrí que, además de buscar DataContractAttribute, también debe permitir System.ServiceModel.MessageContractAttribute y System.SerializableAttribute.
bool canDataContractSerialize = (from x in value.GetType().GetCustomAttributes(true)
where x is System.Runtime.Serialization.DataContractAttribute
| x is System.SerializableAttribute
| x is System.ServiceModel.MessageContractAttributex).Any;