C#通用方法作为带子句的扩展名

时间:2012-12-21 10:47:30

标签: c# generics serialization deserialization serializableattribute

我想创建一个只能为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>();
        }
    }
}

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

您无法测试您建议的属性,但可以测试界面:

public static class Extension
{
    static public ISerializable f_DeepClone(this ISerializable obj)
    {
        // doing some serialization and deserialization
        return (T) obj;
    }
}

答案 2 :(得分: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;
}