Я понимаю, что, вообще говоря, есть последствия использования рефлексии. (Я сам вообще не поклонник размышлений, это чисто академический вопрос.)
Предположим, что существует некоторый класс, который выглядит так:
public class MyClass {
public string GetName() {
return "My Name";
}
}
Медведь со мной здесь. Я знаю, что если у меня есть экземпляр MyClass
, называемый x
, я могу вызвать x.GetName()
. Кроме того, я мог бы установить переменную Func<string>
в x.GetName
.
Теперь вот мой вопрос. Скажем, я не знаю, что указанный класс называется MyClass
; У меня есть объект, x
, но я понятия не имею, что это такое. Я могу проверить, имеет ли этот объект метод GetName
, выполнив это:
MethodInfo getName = x.GetType().GetMethod("GetName");
Предположим, что GetName
не является нулевым. Тогда я не мог бы также проверить, есть ли getName.ReturnType == typeof(string)
и getName.GetParameters().Length == 0
, и на этом этапе я не уверен, что метод, представленный моим объектом GetName
, определенно может быть отброшен в Func<string>
, каким-то образом?
Я понимаю там MethodInfo.Invoke
, и я также понимаю, что всегда мог бы создать Func<string>
как:
Func<string> getNameFunc = () => getName.Invoke(x, null);
Я предполагаю, что я спрашиваю, есть ли способ переместить из a MethodInfo
объект в фактический метод, который он представляет, в результате чего стоимость выполнения рефлексии в процессе, но после этого момента можно вызвать метод напрямую (через, например, Func<string>
или что-то подобное) без штрафа за производительность.
То, что я представляю, может выглядеть примерно так:
// 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);
(Я понимаю, что этого не существует, мне интересно, есть ли что-нибудь подобное.)