基类方法调用中使用的C#泛型参数是Base Class - Not Derived :(

时间:2011-12-08 21:53:51

标签: generics inheritance c#-4.0

我感觉有点瘪了,因为我忘记了在.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 ,而不是我需要的派生实体成为。结果,工厂试图返回

IValidator<BaseEntity> 

而不是

IValidator<DerivedEntity>.  

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

Validator.Validate<BaseEntity>(this)

当我想要的是

Validator.Validate<MyDerivedEntity>(this)

无论如何要使Validator.Validate&lt;&gt;()使用派生类型而不是BaseEntity?

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不要在工厂使用仿制药:

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

(或者您当然可以决定将其转移到其他地方,但原则仍然是:致电GetType()而不是使用typeof(TGeneric)),