对具有不同参数的多个方法使用一个委托

Posted

技术标签:

【中文标题】对具有不同参数的多个方法使用一个委托【英文标题】:Using one delegate to for several methods with different parameters 【发布时间】:2010-02-21 08:18:50 【问题描述】:

是否可以以某种方式将一个委托用于具有不同参数的多个方法? 我使用反射来获取类中的所有方法,并且我想为每个方法分配一个委托并将该委托保存在字典中,并以枚举为键。 如果我正在处理远程过程调用实现,那么枚举是与方法关联的命令。

问候/每人

【问题讨论】:

【参考方案1】:

您需要一种统一的方式来传递参数。这意味着您需要向它们传递一组参数。这意味着您需要MethodInfo,而不是代表。

只需将MethodInfo 与字典中的名称对应起来即可。然后当你需要调用它们时,使用Invoke方法进行调用,传递目标对象和参数数组。

【讨论】:

【参考方案2】:

您可以使用Delegate.CreateDelegate函数并传递适当的委托类型(Action<>Func<>)和MethodInfo的实例,在这种情况下您应该根据MethodInfo参数构造委托类型。

【讨论】:

【参考方案3】:

如果参数个数、顺序和类型相同,是的。

简单地说,委托只是一个方法签名。

【讨论】:

【参考方案4】:

你可以创建一个Dictionary<MyEnum, Object>;。提取值后,将其强制转换为适当的委托并调用它。

或者,您可以使用命令模式之类的东西,并传入命令而不是枚举值:

interface ICommand

    void Execute();


class SomeCommand : ICommand

    public SomeCommand(/* instance and parameters go here */)  /* ... */ 

    public void Execute()  /* ... */ 


class SomeOtherCommand : ICommand  /* ... */ 

如果您希望它们像枚举一样可访问,您可以创建一个带有静态方法的工厂类来创建您的特定命令:

class RemoteCommand

    public static SomeCommand SomeCommand
    
        get
        
            var result = new SomeCommand(/* ... */);
            // ...
            return result;
        
    

    public static SomeOtherCommand SomeOtherCommand  get  /* ... */  

编辑:

此外,不确定您的需求,但公开了用户可能想要进行的方法调用列表,但准确抽象出被调用的内容听起来像一个接口:

interface IRemoteCommand

    void RemoteMethod();
    void OtherRemoteMethod(/* params */);
    void ImplementedAgainstADifferentServerMethod();

【讨论】:

以上是关于对具有不同参数的多个方法使用一个委托的主要内容,如果未能解决你的问题,请参考以下文章

.net:C#的委托

c#中委托的作用是啥?

关于C#委托应用与总结

“委托”一词的意思?

委托的简单使用

委托 详细