Как узнать, имеет ли класс атрибут DataContract? - PullRequest
14 голосов
/ 18 июля 2011

Я пишу функцию сериализации, которая должна определить, имеет ли класс атрибут DataContract. В основном функция будет использовать DataContractSerializer, если класс имеет атрибут DataContract, в противном случае она будет использовать XmlSerializer.

Спасибо за вашу помощь!

Ответы [ 4 ]

18 голосов
/ 18 июля 2011

Простейший способ проверить DataContractAttribute, вероятно, таков:

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

Тем не менее, теперь, когда DC поддерживает сериализацию POCO, она не завершена. Более полный тест на сериализуемость DC будет:

bool f = true;
try {
    new DataContractSerializer(typeof(T));
}
catch (DataContractException) {
    f = false;
}
7 голосов
/ 18 июля 2011
    bool hasDataContractAttribute = typeof(YourType)
         .GetCustomAttributes(typeof(DataContractAttribute), true).Any();
0 голосов
/ 16 апреля 2013

Я обнаружил, что в дополнение к проверке DataContractAttribute необходимо также разрешить System.ServiceModel.MessageContractAttribute и 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;
0 голосов
/ 18 июля 2011

Попробуйте что-то вроде:

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

bool hasDataContractAttribute = (o != null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...