Hai Techies,
在C#中,我们如何定义接受DateTime对象并返回布尔值的多播委托。
谢谢
答案 0 :(得分:34)
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));
}
答案 1 :(得分:3)
任何代表都可以是多播代理
delegate bool myDel(DateTime s);
myDel s = someFunc;
s += someOtherFunc;
委托对象的有用属性 是他们可以分配给一个 委托实例进行多播 使用+运算符。一个组成 委托调用两个代表 由...组成。只有代表 可以组成相同的类型。
修改强> delagate有一个方法GetInvocationList,它返回带有附加方法的列表。
以下是有关Delegate invocation
的参考资料foreach(myDel d in s.GetInvocationList())
{
d();
}
答案 2 :(得分:2)
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;
}
}
答案 3 :(得分:0)
我遇到了同样的问题。我搜索并在msdn。
中找到了这个http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx
代表有两种方法
该链接详细描述了这些代码示例。
我们可以挂钩这些方法来处理委托的返回值。
答案 4 :(得分:0)
在您的情况下,而不是自己创建委托,
最好在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);