Используйте Reflection для вызова универсального метода для экземпляра объекта с подписью: SomeObject.SomeGenericInstanceMethod <T>(аргумент T) - PullRequest
2 голосов
/ 19 января 2011

Как мне позвонить SomeObject.SomeGenericInstanceMethod<T>(T arg)?

Есть несколько сообщений о вызове обобщенных методов, но не совсем так. Проблема заключается в том, что параметр аргумента метода ограничен универсальным параметром.

Я знаю, что если бы вместо подписи была

SomeObject.SomeGenericInstanceMethod<T>(string arg)

тогда я мог бы получить MethodInfo с

typeof (SomeObject).GetMethod("SomeGenericInstanceMethod", new Type[]{typeof (string)}).MakeGenericMethod(typeof(GenericParameter))

Итак, как мне получить MethodInfo, когда обычные аргументы имеют универсальный тип? Спасибо!

Кроме того, могут быть или не быть ограничения типа для универсального параметра.

Ответы [ 2 ]

11 голосов
/ 19 января 2011

Вы делаете это точно так же.

Когда вы вызываете MethodInfo.Invoke, вы все равно передаете все аргументы в object[], так что вам не нужно знать типы во время компиляции.

Пример:

using System;
using System.Reflection;

class Test
{
    public static void Foo<T>(T item)
    {
        Console.WriteLine("{0}: {1}", typeof(T), item);
    }

    static void CallByReflection(string name, Type typeArg,
                                 object value)
    {
        // Just for simplicity, assume it's public etc
        MethodInfo method = typeof(Test).GetMethod(name);
        MethodInfo generic = method.MakeGenericMethod(typeArg);
        generic.Invoke(null, new object[] { value });
    }

    static void Main()
    {
        CallByReflection("Foo", typeof(object), "actually a string");
        CallByReflection("Foo", typeof(string), "still a string");
        // This would throw an exception
        // CallByReflection("Foo", typeof(int), "oops");
    }
}
2 голосов
/ 19 января 2011

Вы делаете это точно так же, но передаете экземпляр вашего объекта:

typeof (SomeObject).GetMethod(
       "SomeGenericInstanceMethod", 
        yourObject.GetType())  
                 // Or typeof(TheClass), 
                 // or typeof(T) if you're in a generic method
   .MakeGenericMethod(typeof(GenericParameter))

Для метода MakeGenericMethod требуется указать только параметры универсального типа, а не аргументы метода.

Вы передадите аргументы позже, когда вызовете метод. Однако в этот момент они передаются как object, так что это снова не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...