C# 委托继承说明
我理解,操作只是一个预先声明的委托,可以接受定义类型的单个参数。因此,C# 委托继承说明,c#,inheritance,delegates,C#,Inheritance,Delegates,我理解,操作只是一个预先声明的委托,可以接受定义类型的单个参数。因此,Action表示一个不返回并接受单个字符串参数的方法。到目前为止还不错 在我的代码中,我有以下方法: public void Send<TMessageType>(Types.MessageBase<TMessageType> message) { Console.WriteLine("Message Sent"); List<Del
Action
表示一个不返回并接受单个字符串参数的方法。到目前为止还不错
在我的代码中,我有以下方法:
public void Send<TMessageType>(Types.MessageBase<TMessageType> message)
{
Console.WriteLine("Message Sent");
List<Delegate> subscriptions;
if (register.TryGetValue(typeof(TMessageType), out subscriptions))
{
foreach (Delegate subscription in subscriptions)
{
Console.WriteLine("Invoking....");
subscription.DynamicInvoke(message);
}
}
}
public void发送(Types.MessageBase消息)
{
Console.WriteLine(“已发送消息”);
列出订阅;
if(register.TryGetValue(typeof(TMessageType),out订阅))
{
foreach(订阅中的委托订阅)
{
Console.WriteLine(“调用…”);
订阅.DynamicInvoke(消息);
}
}
}
subscriptions变量中的所有委托实际上都被实例化为操作。我的问题是,为什么我的代码可以工作?为什么我不需要在使用它之前将我的委托强制转换回一个操作(它将是
操作
)?当然,默认委托类型不知道应该使用哪些参数 简单的回答是,您对DynamicInvoke
的调用是一个后期绑定调用,实际上不知道它是否需要参数
动态调用(后期绑定)由当前委托表示的方法
作为旁注:如果您知道传递给
操作的类型,您可能应该重构代码以直接调用操作,而不使用DynamicInvoke
,如果您可以避免的话,因为这会影响性能。如果由于未显示的限制而无法避免,那么就这样吧
List<Action<Types.MessageBase<TMessageType>>> subscriptions;
if (register.TryGetValue(typeof(TMessageType), out subscriptions))
{
foreach (var subscription in subscriptions)
{
Console.WriteLine("Invoking....");
subscription(message);
}
}
列出订阅;
if(register.TryGetValue(typeof(TMessageType),out订阅))
{
foreach(订阅中的var订阅)
{
Console.WriteLine(“调用…”);
订阅(消息);
}
}
当然,我不知道重构TryGetValue
调用会涉及到什么。不,它不知道也不在乎——它需要一堆“对象”参数并用它调用您的操作。它不会在编译时检查,而是在运行时检查-您使用的是DynamicInvoke
,顾名思义,它会动态调用委托。它比Invoke
慢一个数量级,但能够在运行时自动匹配参数类型,而不依赖于编译时信息