¿Se puede obtener un Func <T> (o similar) de un objeto MethodInfo?

Me doy cuenta de que, en términos generales, hay implicaciones de rendimiento del uso de la reflexión. (Yo mismo no soy fanático de la reflexión, en realidad; esta es una pregunta puramente académica).

Supongamos que existe alguna clase que se ve así:

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

Ten paciencia conmigo aquí. Sé que si tengo una instancia deMyClass llamadox, Puedo llamarx.GetName(). Además, podría establecer unFunc<string> variable ax.GetName.

Ahora aquí está mi pregunta. Digamos yono lo hagas sabe que la clase anterior se llamaMyClass; Tengo un objetox, pero no tengo idea de qué es. Podría comprobar si ese objeto tiene unGetName método haciendo esto:

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

SuponergetName No es nulo. Entonces, ¿no podría además comprobar sigetName.ReturnType == typeof(string) ygetName.GetParameters().Length == 0, y en este punto, ¿no estaría seguro de que el método representado por migetName objeto podríaseguro ser lanzado a unFunc<string>, ¿de alguna manera?

Me doy cuenta de que hay unMethodInfo.Invokey también me doy cuenta de que siempre podríacrear a Func<string> me gusta:

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

Supongo que lo que pregunto es si hay algún camino por recorrerde a MethodInfo objetoa el método real que representa, incurriendo en el costo de rendimiento de la reflexión en elproceso, perodespués ese punto poder llamar al método directamente (a través de, por ejemplo, unFunc<string> o algo similar)sin una penalización de rendimiento.

Lo que estoy imaginando podría verse así:

// 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);

(Me doy cuenta de que eso no existe; me pregunto si hay algome gusta eso.)

Respuestas a la pregunta(6)

Su respuesta a la pregunta