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

时间:2010-02-21 08:18:51

标签: c# delegates

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

此致/每

5 个答案:

答案 0 :(得分:1)

你需要一种统一的传递参数的方法。这意味着你需要传递一组参数。这意味着您需要MethodInfo,而不是代表。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果参数count,order和type相同,是。

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

答案 3 :(得分:0)

您可以尝试的内容类似于BCL的EventHandler委托和EventArgs参数类:

不是直接将所有参数作为参数传递给委托/方法,而是将它们放在某个已知基类型的对象中,然后将该对象传递给委托:

class FooArgs { ... }

delegate void FooDelegate(FooArgs args);

然后,对于需要某些参数的所有方法,从FooArgs派生一个包含所有预期参数的新类。

(虽然这看起来像是绕道而行,但它可能是唯一的选择,因为字典中的所有方法都需要与委托具有相同的“签名”,即相同数量的参数,相同的参数类型,相同的返回类型。 )

答案 4 :(得分:0)

你可以制作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();
}