.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は、コンパイル時に派生型について「認識」しないことに注意してください。
ありがとうございました!
は
工場IValidatorを返す必要があるので、これがどのように動作するのかは分かりません。IValidator GetValidator(Type entityType); –
この回答は合理的なアプローチを提供しますが、私の問題を解決するものではありません。私は物事をどうやってやっているのか再考する必要があります。 –