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 回答