3

Serializableクラスに対してのみ実行できる拡張機能を作成したいと思います。このようなコードはありますか?

using System;

namespace ConsoleApplication2
{
    [Serializable]
    public class Ser
    {

    }

    public class NonSer
    {

    }

    public static class Extension
    {
        static public T f_DeepClone<T>(this T obj)
                             where T : (SerializableAttribute)
        {

            return (T) obj;
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            Ser mc = new Ser();
            mc.f_DeepClone<Ser>();
            NonSer mc1 = new NonSer();
            mc.f_DeepClone<NonSer>();
        }
    }
}
4

3 に答える 3

3

制約で属性を使用したい場合は、次のリンクが役立つと思います。

ただし、ISerializableを使用するようにドメインを制限できる場合は、次のようにすることができます。

public static class Extension<T>
{
    static public T f_DeepClone<T>(this object obj) where T: ISerializable
    {
        // doing some serialization and deserialization
        return (T) obj;
    }
}
于 2012-12-21T10:50:17.883 に答える
1

提案したような属性をテストすることはできませんが、インターフェースをテストすることはできます。

public static class Extension
{
    static public ISerializable f_DeepClone(this ISerializable obj)
    {
        // doing some serialization and deserialization
        return (T) obj;
    }
}
于 2012-12-21T10:50:21.350 に答える
1

属性に基づいてジェネリック型を制限することはできません。

コードを使用するのはあなたです。そうすれば、オブジェクトがシリアル化できる場合とそうでない場合がわかります。コンパイラがあなたを保護する必要はありません。

ただし、実行時に確認する場合は、次のことができます。

static public T f_DeepClone<T>(this object obj)
{
    if(typeof(T).IsSerializable == false)
        throw new ArgumentException("Cannot clone non-serializable objects");

    // doing some serialization and deserialization
    return (T) obj;
}
于 2012-12-21T11:03:07.837 に答える