Utiliser la réflexion pour appeler la méthode générique sur l'instance d'objet avec signature: SomeObject.SomeGenericInstanceMethod (argument de T)

StackOverflow https://stackoverflow.com/questions/4738280

Question

Comment appeler SomeObject.SomeGenericInstanceMethod<T>(T arg)?

Il y a quelques postes à appeler des méthodes génériques, mais pas tout à fait comme celui-ci. Le problème est que le paramètre argument de méthode est limitée au paramètre générique.

Je sais que si la signature était à la place

SomeObject.SomeGenericInstanceMethod<T>(string arg)

alors je pourrais obtenir le MethodInfo avec

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

Alors, comment puis-je obtenir le MethodInfo lorsque les arguments réguliers sont d'un type générique? Merci!

En outre, il peut ou peut ne pas être contraintes de type sur le paramètre générique.

Était-ce utile?

La solution

Vous faites exactement de la même manière.

Lorsque vous appelez MethodInfo.Invoke, vous passez tous les arguments dans un object[] de toute façon, il est donc pas comme vous devez connaître les types au moment de la compilation.

Exemple:

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");
    }
}

Autres conseils

Vous faites exactement de la même façon, mais passez une instance de votre objet:

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

La méthode MakeGenericMethod ne nécessite que pour spécifier les paramètres de type générique, et non des arguments de la méthode.

Vous passerais les arguments plus tard, lorsque vous appelez la méthode. Cependant, à ce stade, ils sont comme passage object, donc il ne nouveau pas d'importance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top