你能在C#中使用“where”来要求一个属性吗?

37

我希望创建一个通用类,只接受可序列化的类,这可以通过where约束实现吗?

我要实现的概念是这样的:

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

44
抱歉,不行。您可以使用约束的唯一方法是:
  • where T : class - T 必须是引用类型
  • where T : struct - T 必须是非可空值类型
  • where T : SomeClass - T 必须是 SomeClass 或从其派生的类
  • where T : ISomeInterface - T 必须是 ISomeInterface 或实现它的类
  • where T : new() - T 必须有一个公共的无参数构造函数
不同的组合可能是可行的,但并不是所有都可以,与属性无关。

1
“where T : ISerializable” 不行吗? - crdx
3
@user457104:那不会强制应用属性。 - Jon Skeet

8

据我所知,你不能这样做。你考虑过添加“初始化”方法或类似的东西吗?

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

我没有测试过这段代码,但希望您能理解我的意思。

3
如果你要进行运行时测试,IsDefined 方法更简单:http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.isdefined.aspx - Jon Skeet
是的,我曾考虑过运行时检查,但想使用 where 约束条件。无论如何,感谢您的答案。 - juan
Jon:你说得完全正确。我不知道我怎么会错过IsDefined方法,但是感谢你指出来! - Patrik Svensson

4

1
我知道这很老了,但我正在使用静态构造函数进行检查。虽然它稍后执行,但可以在运行时抛出错误。

1

如果你正在寻找任何可序列化的类,我想你会很失望。如果你正在寻找你自己创建的对象,你可以创建一个可序列化的基类,并让你想要支持的每个类都从它派生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接