【问题标题】:C# Generic method as extension with where clauseC# 泛型方法作为带有 where 子句的扩展
【发布时间】:2012-12-08 22:43:24
【问题描述】:

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

【问题讨论】:

  • AFAIK 您无法静态检查属性 - 因此请尝试使用 ISerializable 或在代码 bzw 中进行动态运行时检查。为什么是this object obj 而不是this T obj
  • 只能通过反射检查属性。该类实际上并未实现该属性。
  • @Aphelion,在where子句中没有办法检查?

标签: c# generics serialization deserialization serializableattribute


【解决方案1】:

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

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

【讨论】:

  • 不是每个可序列化的类都实现了接口
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您不能根据属性限制通用类型。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多