2011-07-18 14 views
13

クラスにDataContract属性があるかどうかを判断するためのシリアライズ関数を記述しています。基本的には、クラスにDataContract属性がある場合は関数はDataContractSerializerを使用し、それ以外の場合はXmlSerializerを使用します。クラスにDataContract属性があるかどうかを調べるにはどうすればいいですか?

ありがとうございました!以下のような何か試してみてください

答えて

16

最も簡単な方法は、おそらくです:DCは、POCOのシリアル化をサポートしていることを、今、言った

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

が、それは完全なものではありません。 DCのシリアライズのためのより完全なテストは次のようになります。

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

すべての属性を取得する必要はないため、この回答を受け入れたものとします。 – Alex

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

ニースの回答。 LINQでは、パフォーマンスと可読性の両方で 'Count()> 0'より' Any() 'を使用する方が一般的に優れていますが、この場合は学術的な区別があります。 – dbkk

+0

@dbkk、はい、ありがとう、あなたは正しいです。訂正された答え。 – Nagg

+0

あなたの答えをありがとう! – Alex

0

:DataContractAttributeをテストするための

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

bool hasDataContractAttribute = (o != null); 
0

私は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; 
関連する問題