你能用“;其中“;需要c#中的一个属性

本文关键字:属性 一个 其中 需要 | 更新日期: 2023-09-27 17:48:48

我想创建一个只接受可序列化类的泛型类,可以使用where约束吗?

我正在寻找的概念是:

public class MyClass<T> where T : //[is serializable/has the serializable attribute]

你能用“;其中“;需要c#中的一个属性

没有,恐怕没有。你唯一能做的约束是:

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

各种组合是可行的,但不是全部。与属性无关。

我所知道的;你不能这样做。你有没有想过添加一个"Initialize"方法或类似的方法?

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.进行运行时检查

如果您正在寻找任何可序列化的类,我认为您运气不好。如果你正在寻找你已经创建的对象,你可以创建一个可序列化的基类,并让你想要支持的每个类都从中派生

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