你能用“where”来要求c#中的属性吗?

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

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

public class MyClass 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必须有一个公共无参数构造函数

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

我知道的; 你不能做这个。 你有没有添加’Initialize’方法或类似的东西?

 public void Initialize(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进行运行时检查。

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

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