6

閉じられていないタイプのジェネリックを取得する際に問題が発生しています(おそらくC#ジェネリックに精通していないことが原因です)。使用中の明示的なバリデーターインターフェイスを除いて、以下にかなり似ているいくつかのメソッドがあります。

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> {}

上記のメソッドの汎用バージョンでの私の未完了の試みは、次のようになります。

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;
}

unclosedTypeを定義(またはメソッドを再構築)して、を呼び出して元のメソッドと同じ作業を行うにはどうすればよいですか?

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

または、次のような呼び出しで十分になるように、メソッドをさらに改良することは可能でしょうか?

GetValidators<IDeleteValidator<Whatever>>();
4

1 に答える 1

2

私は(他の何よりも私の眠気のために)質問に完全には従いませんでしたが、あなたは後です:

var unclosedTyped = type.GetGenericTypeDefinition();

?(詳細については、ドキュメントを参照してください。)

于 2012-11-07T23:52:38.370 に答える