我想创建一个只接受可序列化类的泛型类,可以通过 where 约束来完成吗?

我正在寻找的概念是这样的:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]
有帮助吗?

解决方案

不,恐怕不是。您可以在约束条件下做的唯一事情是:

  • where T : class - T 必须是引用类型
  • where T : struct - T 必须是不可为 null 的值类型
  • where T : SomeClass - T 必须是 SomeClass 或从它派生
  • where T : ISomeInterface - T 必须是 ISomeInterface 或实现它
  • where T : new() - T 必须有一个公共无参数构造函数

各种组合都是可行的,但不是全部。没什么关于属性的。

其他提示

我所知道的;你不能做这个。 您是否考虑过添加“初始化”方法或类似方法?

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

我没有测试过这段代码,但我希望你明白我的意思。

不敢。您可以做的最好是对 Type.IsSerializable

如果您正在寻找任何可序列化的课程,我认为您运气不好。如果您正在查找已创建的对象,则可以创建一个可序列化的基类,并使您希望支持的每个类都从中派生。

我知道这是旧的,但我使用的是静态构造函数来检查。它稍后但允许您在运行时抛出错误。

scroll top