2011-12-08 2 views
1

.NET과 제네릭에서 정말 근본적인 것임을 잊어 버렸기 때문에 약간의 기분이 들었습니다. 방법은이 문제를 해결합니다. 프로젝트 C# .NET을 4.0이다.기본 클래스 메서드 호출에 사용되는 C# 일반 매개 변수는 기본 클래스 - 파생되지 않았습니다. (

을 내가 BaseEntity이있는 나는 추상적 인 검증에 노력하고 기본 엔티티 클래스가 있습니다.

public abstract class BaseEntity : IEntity 
{ 
    public bool IsValid 
    { 
     get 
     { 
      Validator.Validate(this); 
      return validationResults.Count == 0; 
     } 
    } 
     . 
     . 
} 

유효성 검사기 클래스로 초기화하는 Static Gateway 사용 지정된 IValidator 팩토리. 제공된 구체적인 팩토리 팩토리 구현은, g 실제 검증을 수행하는 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>() 

검사기 클래스에서 호출 될 때, TEntity대신 의 BaseEntity 내가 할 필요 엔티티를 유도을 입력 한 것입니다. 그 결과, 공장은

IValidator<BaseEntity> 

대신

IValidator<DerivedEntity>. 

이 클래스는 그래서 실제로 대해서 Validator.validate (이)BaseEntity에 호출되고 아마 때문이다의 반환을 시도

Validator.Validate<BaseEntity>(this) 

내가 원하는 것은

입니다

Validator.Validate <>() 어쨌든 BaseEntity 대신 파생 된 유형을 사용합니까?

BaseEntity는 컴파일 타임에 파생 형식을 "알지 못합니다.

도움 주셔서 감사합니다.

답변

0

는 공장에서 제네릭을 사용하지 마십시오

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

(또는 당신은 물론 그 다른 곳으로 이동하기로 결정할 수도 있지만 원칙은 남아 : 오히려 typeof(TGeneric)를 사용하는 것보다 GetType() 전화),

+0

공장 여전히 IValidator 을 반환해야하므로 허용되지 않는 방식으로 작동하는지 확신 할 수 없습니다. IValidator GetValidator (Type entityType); –

+0

이 답변은 합리적인 방법을 제공하지만 내 문제에 대한 해결책을 제공하지는 않습니다. 나는 내가 어떻게 일을하는지 재검토해야 할 것이다. –

관련 문제