如何将对象传递给属性构造函数
我试图传递对象到属性构造函数如下:
[PropertyValidation(new NullOrEmptyValidatorScheme())] public string Name { get; private set; }
有了这个属性的构造函数:
public PropertyValidationAttribute(IValidatorScheme validator) { this._ValidatorScheme = validator; }
代码不会编译。 我如何传递一个对象到上面的属性?
编辑:是的NullOrEmptyValidatorScheme实现IValidatorScheme。
错误:错误CS0182:属性参数必须是属性参数types的常量expression式,typeofexpression式或数组创buildexpression式。
属性的值限于简单types; 例如,基本的常量(包括string)和typeof
…你不能使用new
或其他更复杂的代码。 简而言之; 你不能这样做。 你可以给它的types,虽然:
[PropertyValidation(typeof(NullOrEmptyValidatorScheme)]
即PropertyValidation
ctor接受一个Type
,并在代码中使用Activator.CreateInstance
来创build该对象。 请注意,您应该在内部存储string( AssemblyQualifiedName
)。
来自ECMA 334v4:
§24.1.3属性参数types
属性类的位置和命名参数的types仅限于属性参数types ,它们是:
- 以下types之一:
bool
,byte
,char
,double
,float
,int
,long
,short
,string
。- types
object
。- types
System.Type
。- 一个枚举types,只要它具有公共可访问性,嵌套types(如果有的话)也具有公共可访问性。
- 上述types的一维数组。
和
§24.2属性说明
…
如果以下所有语句都为真,则expression式
E
是属性参数expression式:
E
的types是属性参数types(第24.1.3节)。- 在编译时,E的值可以parsing为以下之一:
- 恒定的价值。
- 指定非genericstypes,封闭构造types(第25.5.2节)或未绑定genericstypes(第25.5节)的typeof-expression式(第14.5.11节)。
- 属性参数expression式的一维数组。
正如之前的海报所指出的那样,在属性参数中使用的types是非常严格的限制(可以理解,因为它们的值需要直接序列化到程序集元数据blob中)。
也就是说,你可以创build一个利用typeofs的解决scheme,就像那些可以使用的解决scheme一样。
例如 :
[PropertyValidation(typeof(NullOrEmptyValidatorScheme))] public string Name { get; private set; }
这个语法是完全合法的。 读取你的属性的代码你必须得到validation器types,创buildvalidation器的一个新实例(它甚至可以维护一个在valicatortypes上键入validation器的caching(如果合适的话) – 然后调用它。
另外…(我认为这是一个微软的错误)
你不能把默认值设置为“null”,但默认的简单默认值是OK('false','7','Test')。
NExt的例子会给你以下错误:一个属性参数必须是一个常量expression式,typeofexpression式或数组创buildexpression式的一个属性参数types
在文件中:… \ CSC
public class SampleAttribute : Attribute { private string _test; public SampleAttribute(string test = null) { _test = test; } } [Sample] public class Toto { }