2011-07-18 23 views
13

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.¿Cómo saber si la clase tiene el atributo DataContract?

Gracias por su ayuda!

Respuesta

16

La forma más sencilla de comprobar la DataContractAttribute es probablemente:

bool f = Attribute.IsDefined(typeof(T), typeof(DataContractAttribute)); 

Dicho esto, ahora que DC apoya POCO serialización, no es completa. Una prueba más completa para DC serializabilidad sería:

bool f = true; 
try { 
    new DataContractSerializer(typeof(T)); 
} 
catch (DataContractException) { 
    f = false; 
} 
+0

Establezca esta respuesta como aceptada porque no tengo que obtener todos los atributos. – Alex

7
bool hasDataContractAttribute = typeof(YourType) 
     .GetCustomAttributes(typeof(DataContractAttribute), true).Any(); 
+0

Nice answer. En LINQ, generalmente es mejor usar 'Any()' que 'Count()> 0' tanto para el rendimiento como para la legibilidad, pero en este caso es una distinción académica. – dbkk

+0

@dbkk, sí, gracias, tienes razón. Respuesta corregida – Nagg

+0

¡Gracias por tu respuesta! – Alex

0

intentar algo como:

object o = this.GetType().GetCustomAttributes(true).ToList().FirstOrDefault(e => e is DataContractAttribute); 

bool hasDataContractAttribute = (o != null); 
0

He encontrado que, además de la comprobación de 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; 
Cuestiones relacionadas