gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:18:15 34 4
gpt4 key购买 nike

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

我查看了 Enterprise Library 验证 block 作为一种解决方法,但它不支持开箱即用的单个属性验证。有什么想法吗?

class Program
{
static void Main(string[] args)
{
Stuff t = new Stuff();

try
{
Validator.ValidateProperty(t.X, 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;
}
}
}

关于c# - 使用 Validator 时忽略 .NET 4 RTM MetadataType 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657358/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com