シリアル化可能なクラスのみを受け入れるジェネリック クラスを作成したいのですが、where 制約を使用して実行できますか?
私が探しているコンセプトはこれです:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
シリアル化可能なクラスのみを受け入れるジェネリック クラスを作成したいのですが、where 制約を使用して実行できますか?
私が探しているコンセプトはこれです:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
いいえ、そうではありません。制約でできることは次のとおりです。
where T : class
- T は参照型でなければなりませんwhere T : struct
- T は null 非許容値型でなければなりませんwhere T : SomeClass
- T は SomeClass であるか、そこから派生している必要がありますwhere T : ISomeInterface
- T は ISomeInterface であるか、それを実装する必要がありますwhere T : new()
- T には、パラメーターなしのパブリック コンストラクターが必要です。さまざまな組み合わせが可能ですが、すべてではありません。属性については何もありません。
私が知っていること; これはできません。「Initialize」メソッドなどを追加することについて考えたことはありますか?
public void Initialize<T>(T obj)
{
object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
if(attributes == null || attributes.Length == 0)
throw new InvalidOperationException("The provided object is not serializable");
}
私はこのコードをテストしていませんが、あなたが私の主張を理解してくれることを願っています.
恐れません。あなたができる最善のことは、Type.IsSerializableの実行時チェックです。
シリアル化可能なクラスを探しているなら、運が悪いと思います。作成したオブジェクトを探している場合は、シリアル化可能な基本クラスを作成し、サポートするすべてのクラスをそこから派生させることができます。