如何使用私有方法调整c#类?

时间:2010-11-17 02:13:29

标签: c# command private adapter

我想使用私有方法调整类,以便适配器调用此私有方法:

考虑这个课程

public class Foo
{
   private void bar()
}

我想要一个遵循命令模式的类,并在其执行方法中调用bar():

public class FooCommand
{
   private Foo foo_;
   public FooCommand(Foo foo)
   {
      foo_ = foo;
   }
   public void execute()
   {
      foo.bar();
   }
}

非常感谢任何想法。

谢谢!

5 个答案:

答案 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()。