0

1. オブジェクト応答をパラメーターとして持つ関数 DoSomeService があります。応答は異なるクラスであり、実行時に動的に使用するクラスを内部コードが決定します。

2. 応答クラスの型を取り込んで検証する汎用の Fluent Validator< T> があります。

これで、型チェックを 1 つずつ実行できます。

public override void DoSomeService(object response) {
    object validator = null;
    if (response.GetType()==typeof(TypeA_Response)) validator= new Validator<TypeA_Response>();
    if (response.GetType()==typeof(TypeB_Response)) validator= new Validator<TypeB_Response>();
    if (response.GetType()==typeof(TypeC_Response)) validator= new Validator<TypeC_Response>();
    //......
    if (response.GetType()==typeof(TypeX_Response)) validator= new Validator<TypeX_Response>();
        if (validator.IsValid) {
        //do more stuff ...
    }
}

しかし、特に私が多くの応答を持っている場合、それは良くありません。短くて一般的なものが欲しい。

//response could be TypeA_Response, TypeB_Response, TypeX_Response
public override void DoSomeService(object response) {
    var validator = new Validator<T>();
    if (validator.IsValid) {
        //do more stuff ...
    }
}

もちろん、Fluent Validator に対して T を定義する必要があるため、これは機能しません。「オブジェクト応答」のタイプを検出し、実行時に動的に T に入力するにはどうすればよいですか?

または、これをすべて一緒に行うことを避けて、バリデーター < T> の構造を改善するにはどうすればよいですか?

基本の Service クラスと DoSomeService 関数のシグネチャは変更できないことに注意してください。これはサードパーティ パッケージのオーバーライド関数です。

4

2 に答える 2

2

これを本当に動的にしたい場合は、リフレクションを使用するのが最善の方法です

void DoSomething(object response)
{
    var type = typeof(Validator<>);
    var boundType = type.MakeGenericType(response.GetType());
    var validator = Activator.CreateInstance(boundType);
}

このソリューションを使用しても、何がValidator<T>何であるかわからないため、このコンテキストでは使用できませんTTこの方法で使用するには、静的に定義する必要があります。ジェネリックと非ジェネリックの基本型に分割し、メソッドValidator<T>内で非ジェネリック型を使用する必要がありますDoSomething

Validator valdiator = Activator.CreateInstance(boundType);
于 2013-03-09T00:50:18.757 に答える
1

それは本当にジェネリックの目的ではありません。むしろ、検証を行う仮想メソッドを持つ基本クラスを持つか、具象型が検証メソッドを持つ特定のインターフェイスを実装する必要があります。

于 2013-03-09T00:48:42.733 に答える