2012-11-07 21 views
6

クローズド型のジェネリック型を取得する際に問題が発生している可能性があります。使用している明示的なバリデーターインターフェイスを除いて、以下のようないくつかのメソッドがあります。それは言うと、すべての基本型と指定されたタイプのインターフェイスを収集ようジェネリック型を閉じたジェネリック型の非クローズ型を取得する

public IEnumerable<IDeleteValidator<T>> GetDeleteValidators<T>() 
{ 
    var validatorList = new List<IDeleteValidator<T>>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var validatorType = typeof(IDeleteValidator<>).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<IDeleteValidator<T>>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

方法GetRecursiveBaseTypesAndInterfacesはありません。それで、私が最終的にやっていることは、明示的なバリデーター・インターフェースのクローズド・タイプを取得し、元のタイプTの基本クラスとインターフェースのそれぞれでクローズされたタイプを取得することです。これは私の素晴らしい作品は、しかし、私は私のコードをクリーンアップし、Tのいずれかのバリデータは(怒鳴るよう)IValidatorを延長することを知って

上記よりもより一般的な形でこれを実現したいと思います

public interface IDeleteValidator<in T> : IValidator<T> {} 

上記の方法のジェネリック版で未完了試みは、次のようになります。同じ仕事をするために、私はunclosedTypeを定義(またはメソッドを再構築)するにはどうすればよい

public IEnumerable<TValidator> GetValidators<T, TValidator>() 
    where TValidator : IValidator<T> 
{ 
    var validatorList = new List<TValidator>(); 
    foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T))) 
    { 
     var unclosedType = ??? 
     var validatorType = typeof(unclosedType).MakeGenericType(type); 
     var validators = ObjectFactory 
      .GetAllInstances(validatorType).Cast<TValidator>(); 
     validatorList.AddRange(validators); 
    } 
    return validatorList; 
} 

GetValidators<Whatever, IDeleteValidator<Whatever>>(); 

か、次のような呼び出しは十分であろうと、より多くのように私の方法を改良することが可能であろうを呼び出してiginal方法?

GetValidators<IDeleteValidator<Whatever>>(); 

答えて

2

私はかなり(原因何よりも私の眠気にそれ以上)の質問に従っていませんでしたが、あなたがした後、次のとおりです。

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (詳細は、docsを参照してください。)

+0

これは問題を正確に解決しました。ありがとう。 – rheone

関連する問題