37

シリアル化可能なクラスのみを受け入れるジェネリック クラスを作成したいのですが、where 制約を使用して実行できますか?

私が探しているコンセプトはこれです:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
4

5 に答える 5

43

いいえ、そうではありません。制約でできることは次のとおりです。

  • where T : class- T は参照型でなければなりません
  • where T : struct- T は null 非許容値型でなければなりません
  • where T : SomeClass- T は SomeClass であるか、そこから派生している必要があります
  • where T : ISomeInterface- T は ISomeInterface であるか、それを実装する必要があります
  • where T : new()- T には、パラメーターなしのパブリック コンストラクターが必要です。

さまざまな組み合わせが可能ですが、すべてではありません。属性については何もありません。

于 2008-10-21T12:47:58.567 に答える
8

私が知っていること; これはできません。「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");
}

私はこのコードをテストしていませんが、あなたが私の主張を理解してくれることを願っています.

于 2008-10-21T12:53:49.727 に答える
4

恐れません。あなたができる最善のことは、Type.IsSerializableの実行時チェックです。

于 2008-10-21T12:49:43.697 に答える
1

シリアル化可能なクラスを探しているなら、運が悪いと思います。作成したオブジェクトを探している場合は、シリアル化可能な基本クラスを作成し、サポートするすべてのクラスをそこから派生させることができます。

于 2008-10-21T15:54:59.657 に答える