C#:创建具有布尔返回类型多播委托(C#:Creating Multicast delegate w

2019-07-04 03:46发布

海精工程师,

在C#,我们如何可以定义它接受DateTime对象,并返回一个布尔组播委托。

谢谢

Answer 1:

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));
}


Answer 2:

任何代表可以是一个多播委托

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

MSDN

委托对象的一个​​有用的特性是,它们可以被分配给一个代表实例,使用+运算进行组播。 一个由委托调用这两个代表它是从组成。 同一类型的唯一代表可组成。

编辑:甲delagate有一个方法GetInvocationList返回与所连接的方法的列表。

这是一个关于引用委托调用

foreach(myDel d in s.GetInvocationList())
{
   d();
}


Answer 3:

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;
    }
}


Answer 4:

我在同样的问题绊倒。 我搜索,发现这个MSDN中。

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

上有代表的两种方法

  • 的BeginInvoke
  • EndInvoke会

链接描述了这些详细地说,与代码示例。

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



Answer 5:

在你的情况,而不是自己创建委托的,

最好是在C#诸如Func键谓词使用预先定义的代表:

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

public delegate bool Predicate<in T>(T obj);


文章来源: C#:Creating Multicast delegate with boolean return type
标签: c# delegates