gpt4 book ai didi

c# - 在基类中检索子类类型?

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

我正在尝试使用 Microsoft 企业验证方法在我的实体中执行验证。在我的基类中,我有以下方法:

public class BaseEntity
{
public bool IsValid()
{
return Validate().IsValid;
}

public ValidationResults Validate()
{
return Validation.Validate<this.GetType()>(this);
}

问题在于,即使 BaseEntity 的子类调用 IsValid,this.GetType() 也总是返回 BaseEntity,而不是子类的类型。我不想为每个实体都重写这段代码,因为这看起来很不像 OO。还有其他方法吗?

我确实有想法让 protected 变量 protected Type _validationType,并在每个实体中将其设置为该实体的 .GetType 值,但似乎必须有更好的方法来做到这一点。

更新
显然没关系。 this.GetType() 似乎像我希望的那样工作。不知道为什么以前不是。

我还更改了我的 Validate() 方法以使用以下代码:

 return ValidationFactory.CreateValidator(this.GetType()).Validate(this);

最佳答案

当您使用 O/RM 映射器(例如 LINQ to SQL、NHibernate 或 LINQ to Entities(ADO.NET Entity Framework ))时,我会采用另一种验证方法。我会让实体完全清除验证(所以那里没有 BaseEntity.Validate() 。您可以将此验证逻辑移动到 ObjectContext (EF)/DataContext (L2S)/Session (NH) 并在数据库提交期间触发验证. 查看下面的 LINQ to SQL 示例:

public partial class NorthwindDataContext
{
public override void SubmitChanges(ConflictMode failureMode)
{
var invalidResults = (
from entity in this.GetChangedEntities()
let type = entity.GetType()
let validator = ValidationFactory.CreateValidator(type)
let results = validator.Validate(entity)
where !results.IsValid
from result in results
select result).ToArray();

if (invalidResults.Length > 0)
{
// You should define this exception type
throw new ValidationException(invalidResults);
}

base.SubmitChanges(failureMode);
}

private IEnumerable<object> GetChangedEntities()
{
ChangeSet changes = this.GetChangeSet();
return changes.Inserts.Concat(changes.Updates);
}
}

如果您的实体无效,将抛出 ValidationException。您可以捕获该特定异常并迭代您在其上定义的 InvalidResults 属性。

当您需要更多信息时,我建议您阅读this文章。它还描述了如何使用 Entity Framework 执行此操作。

祝你好运。

关于c# - 在基类中检索子类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215828/

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