2011-07-18 15 views
13

Piszę funkcję serializacji, która musi określić, czy klasa ma atrybut DataContract. Zasadniczo funkcja użyje DataContractSerializer, jeśli klasa ma atrybut DataContract, w przeciwnym razie użyje XmlSerializer.Jak sprawdzić, czy klasa ma atrybut DataContract?

Dzięki za pomoc!

Odpowiedz

16

Najprostszym sposobem sprawdzenia dla DataContractAttribute to prawdopodobnie:

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

Powiedział, że teraz DC wspiera POCO serializacji, to nie jest kompletna. Pełniejszy test DC serializability byłoby:

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

Ustaw tę odpowiedź jako zaakceptowaną, ponieważ nie muszę uzyskiwać wszystkich atrybutów. – Alex

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

Dobra odpowiedź. W LINQ, ogólnie lepiej jest używać 'Any()' niż 'Count()> 0' zarówno pod względem wydajności, jak i czytelności, ale w tym przypadku jest to akademickie rozróżnienie. – dbkk

+0

@dbkk, tak, dzięki, masz rację. Poprawiona odpowiedź. – Nagg

+0

Dzięki za odpowiedź! – Alex

0

Spróbuj coś takiego:

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

bool hasDataContractAttribute = (o != null); 
0

Okazało się, że oprócz sprawdzania DataContractAttribute, należy również umożliwić System.ServiceModel.MessageContractAttribute i 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; 
Powiązane problemy