2017-11-25 11 views
2

コンストラクタに[Serializable]属性を持つオブジェクトのみを受け入れるようにします。C#の[Serializable]属性を持つオブジェクトのみを受け入れるコンストラクタを作成します

public MyClass(? obj) 
{ 
} 

私はC#の

+0

はよろしいですか?その[シリアライズ可能]のものはかなり古いです、我々は今より良い手段があります。 –

+2

短い答え:このコンパイル時間はできません。リフレクションを使用し、実行時に例外をスローします。 –

+2

@HenkHoltermanもっと具体的にお聞かせください。 – Vahid

答えて

3

に私の心に来る最初の事はISerializableインタフェースを実装するオブジェクトのみを許可することで、これを簡単にすることであることをどのように操作を行うことができます:のようなものに

public MyClass(object obj) 
{ 
} 

public MyClass(ISerializable obj) 
{ 
    // ... 
} 

しかし、それは単純すぎると思いますか?また

public MyClass(Object obj) 
{ 
    if (!Attribute.IsDefined(obj.GetType(), typeof(SerializableAttribute))) 
     throw new ArgumentException("The object must have the Serializable attribute.","obj"); 

    // ... 
} 

私はあなたにも使用することによって、それをチェックすることができると思います。

obj.GetType().IsSerializable; 
+2

'obj.GetType()' _is_ Reflection。 –

+0

Err私は、Attribute.IsDefined <_ <0125を使用しないで意味します。 –

+0

私の目標は、コンパイル時に制限することでした。 – Vahid

関連する問題