Я понимаю, что, вообще говоря, использование отражения зависит от производительности. (На самом деле, я вообще не фанат размышлений; это чисто академический вопрос.)
Предположим, существует некоторый класс, который выглядит следующим образом:
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);
Полагаю, я спрашиваю, есть ли способ перейти с MethodInfo
объекта на фактического метода, который он представляет, что влечет за собой снижение производительности отражения в process , но после , когда эта точка может вызывать метод напрямую (например, через 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);
(я понимаю, что этого не существует; мне интересно, есть ли что-нибудь как это.)