2

次の方法を検討してください。

public void foo(int a) {
   //do something with a
}

public void foo(ushort a) {
   //do something with a
}

public void foo<T>(Nullable<T> a) where T : struct {
     if (!a.HasValue) {
        return;
     }

     foo(a.Value); //find appropriate method based on type of a?
}

パラメータのジェネリック型に基づいて呼び出すそれぞれのメソッドを見つける方法はありますか? たとえば、(T)a が int の場合は最初のメソッドを呼び出し、ushort の場合は 2 番目のメソッドを呼び出します。そのようなメソッドが超過しない場合は、おそらく実行時例外をスローします。

私は次のことを試しました:

public void foo<T>(Nullable<T> a) where T : struct {
     if (!a.HasValue) {
        return;
     }
     switch(a.Value.GetType()) {
           case typeof(int): foo((int)a.Value); break;
           case typeof(ushort): foo((ushort)a.Value); break;
           //and so on
     }
}

しかし、コンパイラはキャストを好みません (「型 T を int に変換できません」)。私がやろうとしていることを達成する方法はありますか?

4

1 に答える 1

3

試す

public void foo<T>(Nullable<T> a) where T : struct {
 if (!a.HasValue) {
    return;
 }

 foo((dynamic)a.Value);
}

a.Valueの型は を使用して実行時に解決されdynamic、適切なオーバーロードが呼び出されます。

于 2013-09-10T00:42:19.017 に答える