понедельник, 26 сентября 2011 г.

Вызов методов с Generic параметрами через Reflection

Допустим, есть метод с Generic-параметром

public void GenericMethod<T>()
{
}

и есть метод с параметром типа Type

public void TypeMethod(Type type)
{
}

Вызвать TypeMethod из GenericMethod не составляет труда:

public void GenericMethod<T>()
{
TypeMethod(typeof(T));
}

А как вызвать GenericMethod из TypeMethod?
Поможет Reflection


public static object InvokeGenericMethod(object obj, string methodName, Type genericParam, params object[] pars)
{
var methodInfo = obj.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
var method = methodInfo.MakeGenericMethod(new[] { genericParam });

return method.Invoke(obj, pars);
}

С помощью этого статического метода можно вызвать любой метод любого класса с одним Generic-параметром. Ну и если Generic-параметров больше:

public static object InvokeGenericMethod(object obj, string methodName, Type[] genericParams, params object[] pars)
{
var methodInfo = obj.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
var method = methodInfo.MakeGenericMethod(genericParams);

return method.Invoke(obj, pars);
}

Пример использования:

public void GenericMethod<T>(int param1, object param2)
{
}

public void TypeMethod(Type type, int param1, object param2)
{
InvokeGenericMethod(this, "GenericMethod", type, param1, param2);
}

Комментариев нет:

Отправить комментарий