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

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

问候/每人

【问题讨论】:

    标签: c# delegates


    【解决方案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();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多