C#:使用布尔返回类型创建多播委托

时间:2009-08-31 08:43:20

标签: c# delegates

Hai Techies,

在C#中,我们如何定义接受DateTime对象并返回布尔值的多播委托。

谢谢

5 个答案:

答案 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;

msdn

  

委托对象的有用属性   是他们可以分配给一个   委托实例进行多播   使用+运算符。一个组成   委托调用两个代表   由...组成。只有代表   可以组成相同的类型。

修改 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

代表有两种方法

  • BeginInvoke
  • EndInvoke会

该链接详细描述了这些代码示例。

我们可以挂钩这些方法来处理委托的返回值。

答案 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);