2011-12-08 23 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; 
     } 
    } 
     . 
     . 
} 

Validatorクラスを使用して初期化することが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<MyDerivedEntity>(this) 

Validator.Validate <>()はBaseEntityではなく派生型を使用しますか?

BaseEntityは、コンパイル時に派生型について「認識」しないことに注意してください。

ありがとうございました!

答えて

0

は、工場でジェネリックを使用しないでください。

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

(または、あなたはもちろんのこと他の場所に移動することを決定するかもしれないが、原則は残っています:むしろtypeof(TGeneric)を使用するよりもGetType()を呼び出す)、

+0

工場IValidator を返す必要があるので、これがどのように動作するのかは分かりません。IValidator GetValidator(Type entityType); –

+0

この回答は合理的なアプローチを提供しますが、私の問題を解決するものではありません。私は物事をどうやってやっているのか再考する必要があります。 –

関連する問題