c#泛型方法作为where子句的扩展



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

如果你想在约束中使用属性,我认为以下链接将会有所帮助:

  • 是否可以使用基于属性而不是类型的通用约束?
  • 你能用"where"吗?在c#中需要一个属性?
  • 为通用约束使用属性
  • http://www.techtalkz.com/c-c-sharp/172451-generics-how-have-constraint-attribute.html(泛型:如何对属性进行约束?)

但是,如果您可以限制您的域使用isserializable,您可以这样做:

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

不能根据属性限制泛型类型。

你将是使用代码的人,然后你将知道什么时候对象是可序列化的,什么时候不是。编译器不需要保护您。

但是如果你想在运行时检查,你可以这样做:

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

你不能像你建议的那样测试一个属性,但你可以测试接口:

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

相关内容

  • 没有找到相关文章

最新更新