C# EntLib验证将忽略MetadataType中属性的属性

C# EntLib验证将忽略MetadataType中属性的属性,c#,.net,validation,enterprise-library,metadatatype,C#,.net,Validation,Enterprise Library,Metadatatype,这又是一个EntLib验证程序问题。我正在玩C#中的EntLib 5.0和XP pro中的.Net 4.0 我有一些由T4模板生成的业务对象(部分类)。因此,我决定使用entlib5.0()文档明确推荐的MetadataTypeAttribute将它们的验证属性放在buddy类中。 但是我从ValidatorFactory获得的Validator对象不知道元数据类中定义的验证属性 业务对象的定义如下: [MetadataType(typeof(PatientMetadata))] public

这又是一个EntLib验证程序问题。我正在玩C#中的EntLib 5.0和XP pro中的.Net 4.0

我有一些由T4模板生成的业务对象(部分类)。因此,我决定使用entlib5.0()文档明确推荐的
MetadataTypeAttribute
将它们的验证属性放在buddy类中。 但是我从ValidatorFactory获得的
Validator
对象不知道元数据类中定义的验证属性

业务对象的定义如下:

[MetadataType(typeof(PatientMetadata))]
public partial class Patient
{
    private string _Name;
    private int _DiagnosisCount;

    public int DiagnosisCount
    {
        get
        {
            return _DiagnosisCount;
        }

        set
        {
            if (value != _DiagnosisCount)
            {
                _DiagnosisCount = value;
            }
        }
    }

    public string Name
    {
        get
        {
            return _Name;
        }

        set
        {
            if (value != _Name)
            {
                _Name = value;
            }
        }
    }
}
根据文档,元数据类如下所示:

public class PatientMetadata
{
    [RangeValidator(4)]
    public int DiagnosisCount { get; set; }

    [StringLengthValidator(64, ErrorMessage = "Name must not exceed 64 chars.")]
    public string Name { get; set; }
}
如果我知道,请尝试以这种方式进行验证:

    var factory = ValidationFactory.DefaultCompositeValidatorFactory;
    var validator = factory.CreateValidator<Patient>();
var factory=ValidationFactory.DefaultCompositeValidatorFactory;
var validator=factory.CreateValidator();
…然后观察
验证器
(在调试期间)已经表明,它只是一个
和compositevalidator
,没有任何子验证器。 同样,如果我将验证属性正确地放在
Patient
类中,那么它将非常有效

到现在为止,我真的不知道我在这里遗漏了什么,因为我认为一切都是按照文件进行的


提前感谢你们

元数据类的属性名称必须与主类的属性名称匹配

在您的情况下,元数据类应该如下所示:

public class PatientMetadata
{
    [RangeValidator(0, RangeBoundaryType.Inclusive, 10, RangeBoundaryType.Ignore)]
    public int DiagnosisCount { get; set; }

    [StringLengthValidator(6, ErrorMessage = "Name must not exceed 6 chars.")]
    public string Name { get; set; }
}  

此外,这些文件表明,公认的方法是将所有退货类型声明为
object
。但是,文档也谈到了使用属性,但在其示例中使用了字段,因此请慎重考虑。:)

你说得对,但命名问题只是我的示例中的情况,而不是我的应用程序本身。但我同时发现,如果我在原始类中有属性,那么在元数据类中使用属性是至关重要的。正如你所说,他们在文档中使用字段,我认为这是一种误导。数据类型是不相关的,他们建议使用object,但只要您愿意,您仍然可以使用相应的类型。