質問

シリアル化可能なクラスのみを受け入れるジェネリッククラスを作成したいのですが、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には、パブリックパラメータレスコンストラクタが必要です

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

他のヒント

私が知っていること;これはできません。 「初期化」メソッドなどを追加することを考えましたか?

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

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

これは古いことは知っていますが、チェックには静的コンストラクターを使用しています。後でありますが、実行時にエラーをスローできます。

scroll top