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

标签 c# validation inheritance subclass

我正在尝试使用 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/

相关文章:

c# - 如何使用 C# 代码从 .mdf 文件头获取 Microsoft Sql Server 的产品版本

c# - 处置Microsoft.Office.Interop.Word.Application

c++ - 成员函数指针和继承

c# - 使用 WinForms 组织

c# - 当我不能使函数本身成为静态时如何调用非静态函数

javascript - 验证不是一个函数

java - javax.validation.ConstraintPayload 在 hibernate-validator-5.1.3.Final 中是否已弃用?

javascript - 在javascript中限制正则表达式中的日期和月份

swift : How to use enum variable from super class?

ruby - 在 Go 中建模 "superclass method implementation"的最佳方法是什么?