Ответ 1
Ваш образец кода не будет работать, потому что общий метод ожидает идентификатор типа, а не экземпляр класса Type. Для этого вам нужно использовать отражение:
public class Example {
public void CallingTest()
{
MethodInfo method = typeof (Example).GetMethod("Test");
MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
genericMethod.Invoke(this, null);
}
public void Test<T>()
{
Console.WriteLine(typeof (T).Name);
}
}
Имейте в виду, что это очень хрупкое, я бы предпочел найти другой шаблон, чтобы вызвать ваш метод.
Другое хакерское решение (может быть, кто-то может сделать его немного чище), было бы использовать некоторую магию выражения:
public class Example {
public void CallingTest()
{
MethodInfo method = GetMethod<Example>(x => x.Test<object>());
MethodInfo genericMethod = method.MakeGenericMethod(typeof (string));
genericMethod.Invoke(this, null);
}
public static MethodInfo GetMethod<T>(Expression<Action<T>> expr)
{
return ((MethodCallExpression) expr.Body)
.Method
.GetGenericMethodDefinition();
}
public void Test<T>()
{
Console.WriteLine(typeof (T).Name);
}
}
Обратите внимание на передачу идентификатора типа "объект" в качестве аргумента общего типа в лямбда. Не удалось так быстро разобраться, как обойти это. В любом случае, я думаю, это безопасно для компиляции. Он как-то чувствует себя не так:/