我想使用私有方法调整类,以便适配器调用此私有方法:
考虑这个课程
public class Foo
{
private void bar()
}
我想要一个遵循命令模式的类,并在其执行方法中调用bar():
public class FooCommand
{
private Foo foo_;
public FooCommand(Foo foo)
{
foo_ = foo;
}
public void execute()
{
foo.bar();
}
}
非常感谢任何想法。
谢谢!
答案 0 :(得分:3)
我相信有很多选择:
使用具有FooCommand
方法的接口ICommand
,而不是Execute
。然后以实现Foo
:
ICommand
public class Foo : ICommand {
private void bar() { ... }
void ICommand.Execute() { bar(); }
}
我认为这是最有吸引力的解决方案:该方法仍然可以是私有的;您不需要为每个FooCommand
实例化额外的Foo
;并且您不需要为每个需要它的XCommand
类声明一个单独的X
类。
在FooCommand
类中声明Foo
类,使其成为嵌套类。然后FooCommand
可以访问私有方法。
声明bar
方法公开或内部。
声明bar
方法受保护的或受保护的内部,然后从FooCommand
派生Foo
。
使用Reflection调用私有方法(使用Type.GetMethod
后跟MethodBase.Invoke
)。我相信大多数开发人员会认为这是一个肮脏的黑客。
答案 1 :(得分:2)
你需要至少使bar()受到保护而不是私有。私有函数只能由声明它们的类调用,除非您决定使用Reflection,然后将安全性要求放在您的应用程序上。
答案 2 :(得分:2)
执行此操作的唯一方法是使用反射并以这种方式调用方法,但我强烈建议不要这样做。为什么不把方法设为内部?
答案 3 :(得分:2)
public void execute()
{
var m = foo_.GetType().GetMethod("bar", BindingFlags.NonPublic|BindingFlags.Instance);
m.Invoke(foo_, null);
}
我同意其他海报,他们说如果需要将方法设为内部,并使用InternalsVisibleToAttribute。
答案 4 :(得分:1)
您是否可以访问类Foo,以便修改类?如果没有,我不相信你可以从另一个类调用它的私有方法bar()。