【问题标题】:C# Generic Parameter used in Base Class method call is Base Class - Not Derived :(基类方法调用中使用的 C# 通用参数是基类 - 未派生 :(
【发布时间】:2011-12-08 21:53:51
【问题描述】:

我感觉有点泄气,因为我忘记了一些在 .NET 和泛型中可能非常基础的东西。只是想知道是否有办法解决这个问题。项目是 C# .NET 4.0。

我有一个基础实体类 BaseEntity,我正在尝试对其进行抽象验证。

public abstract class BaseEntity : IEntity
{
    public bool IsValid
    {
        get
        {
            Validator.Validate(this);
            return validationResults.Count == 0;
        }
    }
        .
        .
}

Validator 类使用Static Gateway 用具体的IValidatorFactory 进行初始化。提供的具体工厂实现负责创建实际执行验证的 IValidator。

public class Validator
{
    private static IValidatorFactory factory;

    public static void Initialize(IValidatorFactory validationFactory)
    {
        factory = validationFactory;
    }

    public static void Validate<TEntity>(TEntity entity) where TEntity : IEntity
    {
        if (factory == null) return null;
        var validator = factory.GetValidator<TEntity>();
        if (validator == null) return;
        entity.ClearValidationResults();
        validator.Validate(entity); //Adds validation results to the entity's validation result collection
    }
}

我的问题是当

factory.GetValidatory<TEntity>()

Validator 类中被调用,TEntity 是类型 BaseEntity 而不是 derived 实体我需要它成为。结果,工厂尝试返回一个

IValidator<BaseEntity> 

而不是

IValidator<DerivedEntity>.  

这可能是因为 BaseEntity 类中调用了 Validator.Validate(this) 所以实际上是

Validator.Validate<BaseEntity>(this)

当我想要的时候

Validator.Validate<MyDerivedEntity>(this)

有没有办法让 Validator.Validate() 使用派生类型而不是 BaseEntity?

请注意,BaseEntity 在编译时并不“知道”派生类型。

感谢您的帮助!

【问题讨论】:

    标签: generics inheritance c#-4.0


    【解决方案1】:

    不要在工厂中使用泛型:

    var validator = factory.GetValidator(entity.GetType());
    

    (或者您当然可以决定将其移至其他地方,但原则仍然存在:调用GetType() 而不是使用typeof(TGeneric)),

    【讨论】:

    • 工厂仍然需要返回 IValidator 所以我不确定这将如何工作,因为这是不允许的:IValidator GetValidator(Type entityType);
    • 这个答案提供了一种合理的方法,但它没有为我的问题提供解决方案。我将不得不重新审视我的工作方式。
    猜你喜欢
    • 2019-07-25
    • 2016-01-01
    • 2014-03-17
    • 2014-09-05
    • 2018-11-11
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 2014-03-22
    相关资源
    最近更新 更多