在 Java 中,可以通过声明具有另一个注解类型的注解参数来组合注解。所以例如我可以写这个作文:
@interface Copyright {
String value();
}
@interface Trademark {
String value();
}
@interface IP {
Copyright copyright();
Trademark trademark();
}
@IP(copyright = @Copyright("2013"), trademark = @Trademark("x is a trademark of x inc"))
class MyClass{}
C# 语言规范似乎暗示不可能做类似的事情,因为它规定有效的属性参数类型是:
- 以下类型之一:bool、byte、char、double、float、int、long、sbyte、short、string、uint、ulong、ushort。
- 类型对象。
- 类型 System.Type。
- 枚举类型,前提是它具有公共可访问性,并且它嵌套的类型(如果有)也具有公共可访问性。
- 上述类型的一维数组。
当我尝试编写时,Visual Studio 会向我闪烁各种红色:
[IP (copyright=[Copyright("2008")],trademark=[Trademark("x is a trademark of x, inc")]]
但是语言规范所说的这个“类型对象”呢?由于多态性,我的属性“是一个”对象,那么在 C# 中实现 Java 允许的功能是完全可能的吗?如果不是,那么“类型对象”如何工作?