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
慢一个数量级,但能够在运行时自动匹配参数类型,而不依赖于编译时信息