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 == 0
e, 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.Invoke
e 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.)