День 2274. #ЗаметкиНаПолях
Подробный Обзор CallerMemberName. Окончание
Начало
5. Тип dynamic
Что, если мы вызовем метод SayMyName на экземпляре типа dynamic? Допустим класс CallerMemberNameTests содержит метод SayMyName (определённый в предыдущем посте):
public void CallViaDynamic()
{
Console.WriteLine("Вызов через dynamic:");
dynamic obj = new CallerMemberNameTests();
obj.SayMyName();
}
В этом случае атрибут не работает, и мы получим NULL:
Вызов через dynamic:
Моё имя NULL!
Это происходит, потому что во время компиляции нет ссылки на вызывающий метод.
6. Обработчики событий
Мы определяем события, но их обработчики выполняются не напрямую:
public void CallViaEvent()
{
Console.WriteLine("Вызов через события:");
var source = new MyEventClass();
source.MyEvent += (sender, e) => SayMyName();
source.TriggerEvent();
}
public class MyEventClass
{
public event EventHandler MyEvent;
public void TriggerEvent() =>
MyEvent?.Invoke(this, EventArgs.Empty);
}
Вывод:
Вызов через события:
Моё имя CallViaEventHandler!
Опять же, всё сводится к тому, как метод генерируется во время компиляции: даже если фактическое выполнение не прямое, во время компиляции параметр инициализируется методом CallViaEvent.
7. Конструктор класса
Наконец, что происходит при вызове из конструктора?
public CallerMemberNameTests()
{
Console.WriteLine("Вызов из конструктора:");
SayMyName();
}
Мы можем рассматривать конструкторы как особый вид методов, но какое у него имя?
Вызов из конструктора
Моё имя .ctor!
Фактическое имя метода — .ctor! Независимо от имени класса, конструктор считается методом с этим внутренним именем.
Источник: https://www.code4it.dev/csharptips/callermembername-attribute/
>>Click here to continue<<