Hai Techies,
в С#, как мы можем определить делегат многоадресной передачи, который принимает объект DateTime и возвращает логическое значение.
Спасибо
Hai Techies,
в С#, как мы можем определить делегат многоадресной передачи, который принимает объект DateTime и возвращает логическое значение.
Спасибо
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));
}
Любой делегат может быть делегатом многоадресной рассылки
delegate bool myDel(DateTime s);
myDel s = someFunc;
s += someOtherFunc;
Полезное свойство объектов делегата заключается в том, что они могут быть назначены одному делегировать экземпляр для многоадресной рассылки используя оператор+. Сложный делегат называет двух делегатов был составлен из. Только делегаты один и тот же тип может быть составлен.
EDIT: В delagate есть метод GetInvocationList, который возвращает список с прикрепленными методами.
Вот ссылка на вызов делегата
foreach(myDel d in s.GetInvocationList())
{
d();
}
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;
}
}
Я сталкивался с той же проблемой. Я искал и нашел это в msdn.
http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx
Есть два метода для делегатов
Ссылка описывает их подробно, с образцами кода.
Мы можем использовать эти методы для обработки возвращаемых значений делегатов.
В вашем случае, вместо того, чтобы создавать делегата самостоятельно,
в С# лучше использовать предопределенные делегаты, такие как Func и Predicate:
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
а также
public delegate bool Predicate<in T>(T obj);