gpt4 book ai didi

c# - 如何通过在父类上实现 IDataErrorInfo 来验证子对象

转载 作者:行者123 更新时间:2023-11-30 14:42:08 25 4
gpt4 key购买 nike

我正在使用 MVVM 架构开发 WPF 应用程序。我是 WPF 的业余爱好者,请耐心等待。

我有两个模型类。父类具有另一个(子)类的对象作为其属性。 (我指的是嵌套对象而不是继承对象)

例如,考虑以下场景。

public class Company
{

public string CompanyName {get; set;}

public Employee EmployeeObj {get; set;}
}

public class Employee
{

public string FirstName {get; set;}

public string LastName {get; set;}

}

我想使用 Enterprise Library Validation Block 来验证 Employee 实体的属性。

我能够通过在员工类中实现 IDataErroInfo 接口(interface)来做到这一点,如下所示

public class Employee :  IDataErrorInfo

{

[NotNullValidator(MessageTemplate="First Name is mandatory"]
public string FirstName {get; set;}

[StringLengthValidator(0,20,MessageTemplate="Invalid")]
public string LastName {get; set;}

public string Error
{
get
{
StringBuilder error = new StringBuilder();

ValidationResults results = Validation.ValidateFromAttributes<Employee>(this);

foreach (ValidationResult result in results)
{
error.AppendLine(result.Message);
}

return error.ToString();
}

}

public string this[string propertyName]
{
get
{
ValidationResults results = Validation.ValidateFromAttributes<Employee>(this);

foreach (ValidationResult result in results)
{
if (result.Key == propertyName)
{
return result.Message;
}
}

return string.Empty;
}
}
}

我不想为我创建的每个子模型实现 IDataErroInfo。

有没有办法通过在父(公司)类上实现 IDataErrorInfo 来验证 Employee 对象?

并且还有任何触发器可以开始验证对象。我只想在需要时而不是一直验证对象。

最佳答案

您绝对可以使用验证应用程序 block 在基类上实现 IDataErrorInfoHere is an article那描述了如何。代码基本上归结为:

public abstract class DataErrorInfo : IDataErrorInfo
{
string IDataErrorInfo.Error
{
get { return string.Empty; }
}

string IDataErrorInfo.this[string columnName]
{
get
{
var prop = this.GetType().GetProperty(columnName);
return this.GetErrorInfo(prop);
}
}

private string GetErrorInfo(PropertyInfo prop)
{
var validator = this.GetPropertyValidator(prop);

if (validator != null)
{
var results = validator.Validate(this);

if (!results.IsValid)
{
return string.Join(" ",
results.Select(r => r.Message).ToArray());
}
}

return string.Empty;
}

private Validator GetPropertyValidator(PropertyInfo prop)
{
string ruleset = string.Empty;
var source = ValidationSpecificationSource.All;
var builder = new ReflectionMemberValueAccessBuilder();
return PropertyValidationFactory.GetPropertyValidator(
this.GetType(), prop, ruleset, source, builder);
}
}

您可以使用这个抽象类通过继承它来为您的实体添加验证行为:

public partial class Customer : DataErrorInfo
{
}

关于c# - 如何通过在父类上实现 IDataErrorInfo 来验证子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3321723/

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