2010-11-18 9 views
2

こんにちは!与えられたタイプを汎用タイプに変換するにはどうすればよいですか?

このクラスされています

public static class FooClass<TFoo> 
{ 
    public static TFoo FooMethod(object source) 
    { 
     // implementation goes here 
    } 
} 

は今、私はこのクラスを作成したい:

public static class FooClass 
{ 
    public static object FooMethod(object source, Type fooType) 
    { 
     var classType = typeof (FooClass<>).MakeGenericType(fooType); 
     var methodInfo = classType.GetMethod("FooMethod", new[] 
     { 
      typeof (object) 
     }); 
     // WHAT NOW?! 
    } 
} 

も言及:

  • FooMethodのオーバーロードがFooClass<TFoo>でありますが、私は上記のオーバーロードへのアクセスを与えたいだけです(署名は一致します - paramterNamesを除く)
  • 戻り値のobjectはsuccifient
  • 私はFooMethodFooClassでは一般的なことはできませんでしょう - それは反射コードから使用されるように、それは「オールドスタイル」のインターフェイスである必要があり
+0

ドゥ(非ジェネリックバージョンで実装して)

public static class Foo<TFoo> { public static TFoo FooMethod(object source) { return (TFoo)Foo.FooMethod(source, typeof(TFoo)); } } 

それを変換またはキャストしたいですか? – Bobby

+0

@bobby ?? ...私はメソッドを実行したい:) ...鋳造、別の場所で行われた変換... –

+0

その場合、私はあなたの質問の意味を完全に忘れてしまった。 – Bobby

答えて

6

のような何か:

public static class Foo 
{ 
    public static object FooMethod(object source, Type fooType) 
    { 
     return typeof(Foo<>).MakeGenericType(fooType) 
      .GetMethod("FooMethod").Invoke(null, new object[] { source }); 
    } 
} 

- この反射はタイトループでは遅くなる可能性があります。あなたはこのたくさんやっている場合は、私が依存関係を逆に誘惑されるだろう、そう汎用コードは、非汎用コードを呼び出す:

+0

私は減速について知っています:)それは消費者が減速について知っているオプションのインタフェースです。 –

+0

btw ... excellent :)ありがとう! –

+0

ああ...ちょっと別の質問:リフレクションサポートが「出る」? –

関連する問題