【发布时间】: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