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