命名参数类型约束我正在设计一个自定义属性类。publicclassMyAttr:Attribute{publicValueRangeValRange{get;放;然后我尝试将此属性分配给相邻类中的属性:publicclassFoo{[MyAttr(ValRange=newValueRange())]publicstringProp{get;放;然而,编译器如下抱怨:“ValRange”不是有效的命名属性参数,因为它不是有效的属性参数类型我也尝试将ValueRange类转换为结构,希望作为值类型可以解决问题.有没有解决的办法?有没有解决的办法?不可以。有关详细信息,请参阅C#4规范的第17.1.3节,为方便起见,我将其复制在这里:属性类的位置和命名参数类型仅限于属性参数类型,它们是:没有这些类型构造函数参数或一个的公共字段不能用作属性规范中的位置或命名参数。请记住,属性的作用是在编译时将信息添加到与您放置属性的实体关联的元数据中。这意味着与该属性关联的所有信息必须具有定义明确、明确的方式将其序列化为元数据。通过将合法类型集限制为所有可能类型的一小部分,我们确保编译器始终可以发出消费者可以理解的合法元数据。属性参数值需要在编译时是可解析的(即常量)。参见MSDN上的AttributeParameterTypes:Valuespassedtoattributesmustknowntothecompileratcompiletime。如果可以创建常量ValueRange,则可以使用它。属性参数必须是以下类型的值(引用文章):编辑:将“编译时常量”更改为“值”,因为类型和数组不是常量(感谢指出这一点的评论者(后来删除了出于某种原因,他的评论...))属性只能接收编译时常量作为参数(例如3、“hello”、typeof(MyClass)、“定义所需数据的资源路径”)。我给出的最后一个示例(传递一个类型)可以帮助您设计一个解决方法(传递一个实现接口的类型和您需要的方法)。有没有解决的办法?是的。您可以让您的属性使用Type属性,然后使用实现处理该属性的代码必须假定的已定义接口的类型,从而也为其客户创建一个隐式但希望记录在案的要求:publicinterfaceIValueRange{int}intEnd{得到;}}publicclassMyAttr:Attribute{//使用的类型必须实现IValueRangepublicTypeValueRangeType{get;放;}}//....publicclassFoo{classFooValueRange:IValueRange{publicintStart{get{return10;}}publicintEnd{得到{返回20;}}}[MyAttr(ValueRangeType=typeof(FooValueRange))]publicstringProp{get;放;}}这个是同System.ComponentModel命名空间中的很多类(比如DesignerAttribute。以上就是C#学习教程的全部内容:命名参数类型约束分享,如果对大家有用还需要详细了解C#学习教程,希望大家多加关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载,请注明出处:
