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