0

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するのと同等のタイプセーフはありますか?

いくつかの用語を修正するために編集

4

1 に答える 1

1

C#では、ジェネリックメソッドのタイプを制限して、タイプセーフな方法で閉じられていないタイプのインターフェイスに制限することはできますか?

いいえ。型引数は閉じる必要があるため、型パラメーターを型引数として表現できない型に制約することは意味がありません。

最初の制約部分を忘れてください-この単純なコードは機能しません:

using System;

class Test
{
    static void Main()
    {
        Foo<Action<>>();
    }

    static void Foo<T>()
    {
        Console.WriteLine(typeof(T));
    }
}

エラー:

Test.cs(7,20): error CS1525: Invalid expression term '>'
Test.cs(7,23): error CS1525: Invalid expression term ')'
Test.cs(7,24): error CS1026: ) expected
于 2012-11-28T16:38:32.327 に答える