2011-07-18 5 views

Répondre

16

La façon la plus simple pour tester DataContractAttribute est probablement:

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

Cela dit, maintenant que DC soutient sérialisation POCO, il n'est pas complète. Un test plus complet pour DC sérialisation serait:

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

Définir cette réponse comme acceptée car il n'est pas nécessaire d'obtenir tous les attributs. – Alex

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

Bonne réponse. Dans LINQ, il est généralement préférable d'utiliser 'Any()' que 'Count()> 0' pour les performances et la lisibilité, mais dans ce cas, c'est une distinction académique. – dbkk

+0

@dbkk, oui, merci, vous avez raison. Réponse corrigée – Nagg

+0

Merci pour votre réponse! – Alex

0

Essayez quelque chose comme:

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

bool hasDataContractAttribute = (o != null); 
0

Je trouve qu'en plus de vérifier DataContractAttribute, vous devriez également permettre System.ServiceModel.MessageContractAttribute et 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; 
Questions connexes