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