Ihr Codebeispiel funktioniert nicht, da die generische Methode eine Typ-ID erwartet, keine Instanz der Type-Klasse. Sie müssen Reflektion verwenden, es zu tun:
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);
}
}
im Auge behalten Sie, dass dies sehr spröde ist, würde ich eher vorschlagen, ein anderes Muster zu finden Ihre Methode aufzurufen.
Eine weitere hacky-Lösung (vielleicht jemand kann es ein bisschen sauberer machen) wäre etwas Ausdruck Magie zu verwenden:
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);
}
}
Hinweis Übergabe die ‚Objekt‘ Typkennung als Gattungstypargument in dem Lambda. Konnte nicht so schnell herausfinden, wie man das schafft. So oder so, das ist kompilierungssicher, denke ich. Es fühlt sich einfach irgendwie falsch an:/
Nur weil es schwer zu finden ist: Mit 'dynamic' ersparen Sie sich alle fehleranfälligen Reflektionsarbeiten. Die beste Antwort gibt es in der referenzierten Frage: http://stackoverflow.com/a/22441650/143684 – ygoe