海精工程师,
在C#,我们如何可以定义它接受DateTime对象,并返回一个布尔组播委托。
谢谢
海精工程师,
在C#,我们如何可以定义它接受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;
MSDN
委托对象的一个有用的特性是,它们可以被分配给一个代表实例,使用+运算进行组播。 一个由委托调用这两个代表它是从组成。 同一类型的唯一代表可组成。
编辑:甲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
上有代表的两种方法
链接描述了这些详细地说,与代码示例。
我们可以挂接到这些方法来处理委托的返回值。
在你的情况,而不是自己创建委托的,
最好是在C#诸如Func键和谓词使用预先定义的代表:
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
和
public delegate bool Predicate<in T>(T obj);