Я чувствую себя немного раздутым, поскольку я забыл кое-что, что, вероятно, действительно фундаментально в .NET и обобщениях.Просто интересно, есть ли способ это исправить.Проект - C # .NET 4.0.
У меня есть базовый класс сущностей BaseEntity , для которого я пытаюсь абстрагировать проверку.
public abstract class BaseEntity : IEntity
{
public bool IsValid
{
get
{
Validator.Validate(this);
return validationResults.Count == 0;
}
}
.
.
}
В классе Validator используется Статический шлюз для инициализации с конкретным заводом IValidator.Предоставленная конкретная фабричная реализация отвечает за создание 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 class, TEntity - это тип BaseEntity вместо производного объекта, которым я должен быть.В результате фабрика пытается вернуть
IValidator<BaseEntity>
вместо
IValidator<DerivedEntity>.
Это, вероятно, потому, что Validator.Validate (this) вызывается вкласс BaseEntity на самом деле
Validator.Validate<BaseEntity>(this)
, когда мне нужно
Validator.Validate<MyDerivedEntity>(this)
Есть ли способ заставить Validator.Validate <> () использовать производноетипа вместо BaseEntity?
Обратите внимание, что BaseEntity не "знает" о производных типах во время компиляции.
Спасибо за вашу помощь!