我需要定义一个方法参数,理想情况下应该只接受用Serializable
属性修饰的对象参数。方法任务是将对象参数持久化为XML文档。
我知道我最终可以检查SerializationException
,但我更希望能够将其巧妙地定义为方法合同的一部分。那么,有什么方法可以隔离用这个属性修饰的类型吗?
一个选项是使用Type
类的IsSerializable
属性:
public void Serialize(object obj)
{
if (obj.GetType().IsSerializable)
{
// do work
}
}
您可以对对象的类型使用GetCustomAttributes
函数。
public void Serialize(object itemToSerialize)
{
var hasAttribute = itemToSerialize.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Any();
// Do stuff.
}
但是,不要忘记,普通序列化也支持ISerializable
。因此,类型的IsSerializable
属性可能更合适。
编辑我认为您正在寻找一种方法,让编译器强制参数具有属性。没有办法做到这一点。您必须使用如上所述的运行时检查并抛出异常。
泛型通常是这类任务的朋友,在这种情况下,您可以在类型实现ISerializable
的情况下使用泛型参数,但正如您所知,这将排除声明而不是实现序列化的情况。
如果您可以进一步限制,以便只允许实现ISerializable的对象,那么您可以使用泛型来获得编译时检查
public void Serialize<T>(T obj) where T : ISerializable
{
// Do work
}
不幸的是,这不算是对您问题的回答,因为不是每个Serializable
类都实现ISerializable