命名参数类型约束

Fei*_*ngo 7 c# custom-attributes .net-3.5

我正在设计一个自定义属性类.

public class MyAttr: Attribute
{
    public ValueRange ValRange { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我试图将此属性分配给相邻类中的属性:

public class Foo
{
    [MyAttr(ValRange= new ValueRange())]
    public string Prop { get; set; }
}  
Run Code Online (Sandbox Code Playgroud)

但是,编译器抱怨以下内容:

'ValRange'不是有效的命名属性参数,因为它不是有效的属性参数类型

我也尝试将ValueRange类转换为a struct,希望成为值类型可以解决问题.有没有办法解决?

Eri*_*ert 21

有没有办法解决?

没有.

有关更多详细信息,请参阅C#4规范的第17.1.3节,为方便起见,我在此重现:


属性类的位置和命名参数的类型仅限于属性参数类型,它们是:

  • 以下类型之一:bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort.
  • 类型对象.
  • 类型System.Type.
  • 枚举类型,前提是它具有公共可访问性,并且嵌套类型(如果有)也具有公共可访问性.
  • 上述类型的一维阵列.

不具有这些类型之一的构造函数参数或公共字段不能用作属性规范中的位置参数或命名参数.


请记住,属性的要点是在编译时将信息添加到与您放置属性的实体关联的元数据.这意味着与该属性相关的所有信息必须具有明确定义的,明确的方式来将其序列化为元数据.通过将合法类型集限制为所有可能类型的一小部分,我们确保编译器始终可以发出消费者可以理解的合法元数据.