我感觉有点瘪了,因为我忘记了在.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在编译时不会“知道”派生类型。
感谢您的帮助!
答案 0 :(得分:0)
不要在工厂使用仿制药:
var validator = factory.GetValidator(entity.GetType());
(或者您当然可以决定将其转移到其他地方,但原则仍然是:致电GetType()
而不是使用typeof(TGeneric)
),