如何将对象传递给属性构造函数

我试图传递对象到属性构造函数如下:

[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之一: boolbytechardoublefloatintlongshortstring
  • typesobject
  • typesSystem.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 { }