Vous pouvez obtenir un Func<T> (ou similaire) à partir d'un MethodInfo objet?

Je me rends compte que, de façon générale, il y a des implications sur les performances de l'utilisation de la réflexion. (Je me suis pas une fan de réflexion à tous, en fait; c'est une question purement académique.)

Supposons qu'il existe une certaine classe qui ressemble à ceci:

public class MyClass {
    public string GetName() {
        return "My Name";
    }
}

Ours avec moi ici. Je sais que si j'ai une instance de MyClass appelé x, je peux appeler x.GetName(). De plus, j'ai mis un Func<string> variable x.GetName.

Maintenant, voici ma question. Disons que je ne pas savoir la classe ci-dessus est appelé MyClass; j'ai quelques objets, x, mais je n'ai aucune idée de ce que c'est. J'ai pu vérifier pour voir si l'objet a une GetName méthode en faisant ceci:

MethodInfo getName = x.GetType().GetMethod("GetName");

Supposons que getName n'est pas nulle. Alors je n'ai pas pu en outre vérifier si getName.ReturnType == typeof(string) et getName.GetParameters().Length == 0, et à ce point, je ne serais pas tout à fait certain que la méthode représentée par mes getName objet pourrait certainement être exprimées à une Func<string>, en quelque sorte?

Je me rends compte il y a un MethodInfo.Invoke, et je me rends compte aussi que je pourrais toujours créer un Func<string> comme:

Func<string> getNameFunc = () => getName.Invoke(x, null);

Je crois que je vais poser est de savoir si il existe un moyen d'aller de un MethodInfo objet à la méthode qu'il représente, d'encourir le coût de la réflexion dans le processus, mais après que point de pouvoir appeler la méthode directement (via, par exemple, un Func<string> ou quelque chose de similaire) sans performances.

Ce que je suis à envisager pourrait ressembler à quelque chose comme ceci:

//obviously this would throw an exception if GetActualInstanceMethod returned
//something that couldn't be cast to a Func<string>
Func<string> getNameFunc = (Func<string>)getName.GetActualInstanceMethod(x);

(Je me rends compte qui n'existe pas; je me demandais si il n'y a rien comme il.)

  • Sur les commentaires que vous faites dans votre travail d'édition - vous verrez une énorme augmentation de la vitesse avec des solutions de ce type, parce qu'il y a très peu de différence entre un compilé dynamiquement délégué et un compilés statiquement un; une fois la surcharge de la compilation est pris en compte. Depuis que j'ai "découvert" l'expression des arbres de choses, j'ai été en utilisant tous les sens, et sans doute que mon #1 fonction de .Net 3.5 . En v4, c'est encore mieux que vous pouvez écrire plusieurs instructions de code nécessaire à cause des extensions requises par le DLR.
InformationsquelleAutor Dan Tao | 2010-05-29