このようなことをする方法はありますか?
void SomeMethod(Type generic)
{
SomeGenericMethod<generic>();
}
ジェネリック型パラメーターではなく、「通常の」パラメーターとして型を渡す必要があります。
あなたは反射でそれを行うことができます:
public class foo
{
public void SomeMethod(Type type)
{
var methodInfo = this.GetType().GetMethod("SomeGenericMethod");
var method = methodInfo.MakeGenericMethod(new[] { type });
method.Invoke(this, null);
}
public void SomeGenericMethod<T>()
{
Debug.WriteLine(typeof(T).FullName);
}
}
class Program
{
static void Main(string[] args)
{
var foo = new foo();
foo.SomeMethod(typeof(string));
foo.SomeMethod(typeof(foo));
}
}
とは言うものの、このようにリフレクションを使用することは、そもそもジェネリックを使用することの利点のいくつかを失うことを意味するので、他の設計の代替案を検討することをお勧めします。
メソッドがMyClassというクラスで定義されているとすると、次のようになります。
var MyObject = new MyClass();
typeof(MyClass).GetMethod("SomeGenericMethod").MakeGenericMethod(generic).Invoke(myObject, null);
Type.GetMethod()は、呼び出されたTypeで定義されたメソッドを記述するオブジェクトを取得します。このメソッドはジェネリックであるため、MakeGenericMethodを呼び出して、その1つのジェネリックパラメーターを渡す必要があります。
次に、メソッドを呼び出し、メソッドが呼び出すオブジェクトとそれが取る引数を渡します。引数を取らないので、nullを渡すだけです。