C #: создание многоадресного делегата с логическим типом возврата - PullRequest
11 голосов
/ 31 августа 2009

Hai Techies,

в C #, как мы можем определить многоадресный делегат, который принимает объект DateTime и возвращает логическое значение.

Спасибо

Ответы [ 5 ]

34 голосов
/ 31 августа 2009
public delegate bool Foo(DateTime timestamp);

Это способ объявления делегата подписью, которую вы описываете. Все делегаты потенциально многоадресные, они просто требуют инициализации. Такие как:

public bool IsGreaterThanNow(DateTime timestamp)
{
    return DateTime.Now < timestamp;
}

public bool IsLessThanNow(DateTime timestamp)
{
    return DateTime.Now > timestamp;
}

Foo f1 = IsGreaterThanNow;
Foo f2 = IsLessThanNow;
Foo fAll = f1 + f2;

Вызов fAll, в этом случае вызовет IsGreaterThanNow() и IsLessThanNow().

Чего это не делает, это дает вам доступ к каждому возвращаемому значению. Все, что вы получите, это последнее возвращенное значение. Если вы хотите получить каждое значение, вам придется обрабатывать многоадресную передачу вручную следующим образом:

List<bool> returnValues = new List<bool>();
foreach(Foo f in fAll.GetInvocationList())
{
    returnValues.Add(f(timestamp));
}
3 голосов
/ 31 августа 2009

Любой делегат может быть многоадресным делегатом

delegate bool myDel(DateTime s);
myDel s = someFunc;
s += someOtherFunc;

* 1005 MSDN *

Полезное свойство объектов-делегатов. является то, что они могут быть назначены одному экземпляр делегата для многоадресной рассылки используя оператор +. Составленный делегат называет двух делегатов это был составлен из. Только делегаты один и тот же тип может быть составлен.

EDIT: Делагат имеет метод GetInvocationList , который возвращает список с прикрепленными методами.

Вот ссылка на Вызов делегата

foreach(myDel d in s.GetInvocationList())
{
   d();
}
2 голосов
/ 31 августа 2009
class Test
{
    public delegate bool Sample(DateTime dt);
    static void Main()
    {
        Sample j = A;
        j += B;
        j(DateTime.Now);

    }
    static bool A(DateTime d)
    {
        Console.WriteLine(d);
        return true;
    }
    static bool B(DateTime d)
    {
        Console.WriteLine(d);
        return true;
    }
}
0 голосов
/ 15 декабря 2018

В вашем случае, вместо того, чтобы создавать делегата самостоятельно,

лучше использовать предопределенные делегаты в C #, такие как Func и Predicate :

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

и

public delegate bool Predicate<in T>(T obj);
0 голосов
/ 10 февраля 2014

Я наткнулся на ту же проблему. Я искал и нашел это в MSDN.

http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx

Есть два метода для делегатов

  • BeginInvoke
  • EndInvoke

Ссылка описывает их подробно, с примерами кода.

Мы можем подключиться к этим методам для обработки возвращаемых значений делегатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...