Delegate
Любой делегат наследует Delegate. У экземпляра
можно прочитать Method - описание метода,
и Target - объект, на котором метод
вызывается, или null для статического
метода. Так проверяют, что в переменной
лежит именно делегат, а не произвольный тип.
Синтаксис
Delegate del = метод;
string name = del.Method.Name;
object target = del.Target;
Пример
Давайте выведем имя метода у Action:
using System;
class Program
{
static void Ping()
{
}
static void Main()
{
Action act = Ping;
Delegate del = act;
Console.WriteLine(del.Method.Name);
}
}
Результат выполнения кода:
"Ping"
Пример
Давайте сравним пользовательский delegate и Action:
using System;
delegate void MyHandler();
class Program
{
static void Ping()
{
}
static void Main()
{
MyHandler custom = Ping;
Action act = Ping;
bool fromDelegate =
typeof(MyHandler).IsSubclassOf(typeof(Delegate)) &&
typeof(Action).IsSubclassOf(typeof(Delegate));
Console.WriteLine(fromDelegate);
}
}
Результат выполнения кода:
True
Пример
Давайте прочитаем Target у экземплярного метода:
using System;
class Worker
{
public void Run()
{
}
}
class Program
{
static void Main()
{
var worker = new Worker();
Action act = worker.Run;
Delegate del = act;
Console.WriteLine(del.Target == worker);
}
}
Результат выполнения кода:
True
Смотрите также
-
delegate,
ключевое слово для своего типа делегата -
Action,
готовый делегат без возвращаемого значения -
Combine,
который склеивает несколько делегатов -
EventHandler,
стандартный делегат для событий