На самом деле, я должен был это заметить с самого начала, но, поскольку Джон тоже этого не сделал, я не слишком расстроен из-за этого:)
Код, который вы должны начать с вашего вопроса, не компилируется:
Wrapper(() => TestClass.Hello);
Это не полный код. Вы также должны иметь:
Wrapper(TestClass.Hello);
^
|
+-- notice the missing () => here
или
Wrapper(() => TestClass.Hello());
^
|
+-- notice the added parenthesis here
И теперь, когда вы отредактировали свой вопрос, стало ясно, что у вас есть вторая форма.
Между ними есть тонкая разница. Тонко для нас, но важно для компилятора:
Wrapper(TestClass.Hello);
^------+------^
|
+-- This is a method group
Wrapper(() => TestClass.Hello());
^------+--------^
|
+-- This is a method call
Группа методов - это ссылка на метод (или его перегрузки), вызов метода - исполняемый код.
Отличие от компилятора заключается в том, что в первом фрагменте кода компилятор заключает группу методов в действие, в основном компилируя ее так:
Wrapper(new Action(TestClass.Hello));
и, таким образом, вы передаете этот метод в метод Wrapper внутри делегата Action.
Однако вторая форма обрабатывается совсем по-другому. Теперь компилятор создает новый метод для содержания вашего кода, а затем передает новый метод в метод Wrapper вместо кода, который вы имели.
Таким образом, ваш код на самом деле выглядит так:
public static void Main()
{
Wrapper(new Action(TempMethod1));
}
private static void TempMethod1()
{
TestClass.Hello();
}
И именно поэтому вы видите класс формы как владельца метода, потому что это то, что он есть.
Причина, по которой я спросил в комментарии, принимаете ли вы делегата или выражение лица, заключается в том, что мой мозг работал на половине скорости. Было обнаружено что-то странное, но не вся картина.
Если вы хотите передать подобный код методу и работать с ним, у вас есть два варианта:
- Для делегата работайте с рефлексией, декомпилируйте код и анализируйте его, найдите вызов метода и выясните, в каком классе он сделан
- Для выражения проанализируйте части выражения (для этого требуется C # 3 или выше)
Поскольку ни то, ни другое не является тривиальным, я не собираюсь публиковать здесь какой-либо код, достаточно сказать, что то, что вы спрашиваете, требует нового вопроса. Из двух, я предлагаю вам пойти по пути выражения, если можете.