Общий параметр C #, используемый в вызове метода базового класса, - это базовый класс - не получено - PullRequest
1 голос
/ 09 декабря 2011

Я чувствую себя немного раздутым, поскольку я забыл кое-что, что, вероятно, действительно фундаментально в .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 не "знает" о производных типах во время компиляции.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 09 декабря 2011

Не используйте генерики на фабрике:

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

(Или, конечно, вы можете решить переместить это в другое место, но принцип остается: звоните GetType() вместо использования typeof(TGeneric)),

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...