【发布时间】:2010-02-21 08:18:50
【问题描述】:
是否可以以某种方式将一个委托用于具有不同参数的多个方法? 我使用反射来获取类中的所有方法,并且我想为每个方法分配一个委托并将该委托保存在字典中,并以枚举为键。 如果我正在处理远程过程调用实现,那么枚举是与方法关联的命令。
问候/每人
【问题讨论】:
是否可以以某种方式将一个委托用于具有不同参数的多个方法? 我使用反射来获取类中的所有方法,并且我想为每个方法分配一个委托并将该委托保存在字典中,并以枚举为键。 如果我正在处理远程过程调用实现,那么枚举是与方法关联的命令。
问候/每人
【问题讨论】:
您需要一种统一的方式来传递参数。这意味着您需要向它们传递一组参数。这意味着您需要MethodInfo,而不是代表。
只需将MethodInfo 与字典中的名称对应起来即可。然后当你需要调用它们时,使用Invoke方法进行调用,传递目标对象和参数数组。
【讨论】:
您可以使用Delegate.CreateDelegate函数并传递适当的委托类型(Action<>或Func<>)和MethodInfo的实例,在这种情况下您应该根据MethodInfo参数构造委托类型。
【讨论】:
如果参数个数、顺序和类型相同,是的。
简单地说,委托只是一个方法签名。
【讨论】:
你可以创建一个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();
}
【讨论】: