使用Validator时忽略.NET 4 RTM MetadataType属性

我正在使用VS 2010 RTM并尝试使用MetadataTypeAttribute对简单类型执行一些基本validation。 当我将validation属性放在主类上时,一切正常。 但是,当我把它放在元数据类上时,它似乎被忽略了。 我一定是错过了一些微不足道的东西,但我现在已经坚持了一段时间。

我查看了Enterprise Libraryvalidation块作为一种解决方法,但它不支持开箱即用的单个属性validation。 有任何想法吗?

class Program { static void Main(string[] args) { Stuff t = new Stuff(); try { Validator.ValidateProperty(tX, new ValidationContext(t, null, null) { MemberName = "X" }); Console.WriteLine("Failed!"); } catch (ValidationException) { Console.WriteLine("Succeeded!"); } } } [MetadataType(typeof(StuffMetadata))] public class Stuff { //[Required] //works here public string X { get; set; } } public class StuffMetadata { [Required] //no effect here public string X { get; set; } } 

似乎Validator不尊重MetadataTypeAttribute:

http://forums.silverlight.net/forums/p/149264/377212.aspx

这种关系必须明确登记:

  TypeDescriptor.AddProviderTransparent( new AssociatedMetadataTypeTypeDescriptionProvider( typeof(Stuff), typeof(StuffMetadata)), typeof(Stuff)); 

此帮助程序类将注册程序集中的所有元数据关系:

 public static class MetadataTypesRegister { static bool installed = false; static object installedLock = new object(); public static void InstallForThisAssembly() { if (installed) { return; } lock (installedLock) { if (installed) { return; } foreach (Type type in Assembly.GetExecutingAssembly().GetTypes()) { foreach (MetadataTypeAttribute attrib in type.GetCustomAttributes(typeof(MetadataTypeAttribute), true)) { TypeDescriptor.AddProviderTransparent( new AssociatedMetadataTypeTypeDescriptionProvider(type, attrib.MetadataClassType), type); } } installed = true; } } } 

向ValidationContext构造函数提供元数据类而不是主类的实例似乎对我有用。