我想创建一个只接受可序列化类的泛型类,可以使用where约束来完成吗?你可以使用“where”在c#中要求属性吗?
我在寻找的概念是这样的:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
我想创建一个只接受可序列化类的泛型类,可以使用where约束来完成吗?你可以使用“where”在c#中要求属性吗?
我在寻找的概念是这样的:
public class MyClass<T> where T : //[is serializable/has the serializable attribute]
不,恐怕不行。你可以用约束做的唯一的事情是:
where T : class
- T必须是引用类型where T : struct
- T必须是一个非空值类型where T : SomeClass
- T必须是SomeClass的或派生它where T : ISomeInterface
- T必须ISomeInterface或实现它where T : new()
- T必须有一个公共的无参数构造函数各种组合是可行的,但不是全部。没有关于属性。
不怕。你可以做的最好是运行时检查Type.IsSerializable。
我所知道的;你不可以做这个。 你有没有关于添加'初始化'方法或类似的东西?
public void Initialize<T>(T obj)
{
object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute));
if(attributes == null || attributes.Length == 0)
throw new InvalidOperationException("The provided object is not serializable");
}
我还没有测试过这个代码,但我希望你明白我的观点。
如果你正在寻找任何可序列化的类,我认为你运气不好。如果您正在查找已创建的对象,则可以创建一个可序列化的基类,并让您希望支持的每个类都从其派生。
我知道这是旧的,但我使用静态构造函数来检查。它稍后,但允许您在运行时抛出一个错误。
会`哪里T:ISerializable`不是吗? – crdx 2012-06-07 14:35:01
@ user457104:这不会强制应用该属性,否。 – 2012-06-07 15:33:27
啊,是的,哎呀。 – crdx 2012-06-07 19:11:25