繁体   English   中英

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

[英]C# Generic method as extension with where clause

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

如果您想在约束中使用Attributes,我认为以下链接会有所帮助:

但是,如果您可以限制您的域使用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;
    }
}

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

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

您不能基于属性限制通用类型。

您将成为使用代码的人,然后您将知道对象何时可序列化以及何时不可序列化。 编译器无需保护您。

但是,如果要在运行时检查,您可以执行以下操作:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM