C#では、ジェネリックメソッドの型パラメーターを制約して、型に安全な方法で閉じられていない型のインターフェイスに制限することはできますか?詳しく説明させてください...
たとえば、次の疑似コードがあります。
public bool Validate<TValidator>(object validatable)
where TValidator : IValidator<>
{
// code that finds all implementations of IValidator that closes on
// recursive base types / interfaces of the validatable object
// return true if validates
}
ICreateValidatorやIDeleteValidatorなどのIValidatorを実装するインターフェイスがいくつかあります。すべてのタイプT、Tのすべての基本クラス、およびTによって実装されたインターフェイスに近い方法で、必要なバリデーターを簡単に収集できます。
欲望は、の線に沿って何かを呼び出すことができるでしょう
var validates = Validate<IDeleteValidator<>>(concreteDomainObject);
これにより、閉じられていないタイプのIDeleteValidator <>が提供され、IDeleteValidaorの各実装を内部で見つけることができます。ここで、TはconcreteDomainObjectタイプ、concreteDomainObjectタイプが実装するインターフェイス、または再帰ベースタイプconcreteDomainObjectタイプがオブジェクトまで拡張されます。 。
確かに、ドメインオブジェクトのインターフェイスを閉じることはできますが、呼び出す必要があることは私には意味がありません。
Type unclosedValidatorType = typeof (TValidator).GetGenericTypeDefinition()
コンパイル時にTValidatorがジェネリック型であるとは確信できず、明示的に閉じられたTValidatorは、閉じている型を取り除く以外は使用されないことを考えると、これは私にとって間違った方法のようです。
私が提供した疑似コードは明らかに機能しますが、ジェネリックメソッドのタイプを特定のインターフェイスの閉じられていないタイプにconstrianするのと同等のタイプセーフはありますか?
いくつかの用語を修正するために編集