Você pode obter um Func <T> (ou similar) de um objeto MethodInfo?

Percebo que, de um modo geral, há implicações no desempenho do uso da reflexão. (Eu mesmo não sou fã de reflexão, na verdade; essa é uma questão puramente acadêmica.)

Suponha que exista alguma classe que se parece com isso:

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

Tenha paciência comigo aqui. Eu sei que se eu tiver uma instância deMyClass chamadox, Eu posso ligarx.GetName(). Além disso, eu poderia definir umFunc<string> variável parax.GetName.

Agora aqui está a minha pergunta. Digamos que eunão sabe que a classe acima é chamadaMyClass; Eu tenho algum objetox, mas não tenho ideia do que é. Eu poderia verificar se esse objeto tem umGetName método, fazendo o seguinte:

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

SuponhagetName não é nulo. Então eu não poderia, além disso, verificar segetName.ReturnType == typeof(string) egetName.GetParameters().Length == 0e, neste momento, eu não teria certeza de que o método representado pelo meugetName objeto poderiadefinitivamente ser lançado para umFunc<string>, de alguma forma?

Eu percebo que há umaMethodInfo.Invokee também percebo que sempre poderiacrio a Func<string> gostar:

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

Acho que estou perguntando se há algum caminho a percorrerde a MethodInfo objetopara o método real que representa, incorrendo no custo de desempenho da reflexão noprocesso, masdepois de Nesse ponto, é possível chamar o método diretamente (via, por exemplo, umFunc<string> ou algo semelhante)sem uma penalidade de desempenho.

O que estou imaginando pode ser algo como isto:

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

(Percebo que isso não existe; estou me perguntando se há algogostar isto.)

questionAnswers(6)

yourAnswerToTheQuestion