【问题标题】:How can I adapt a c# class with private methods?如何使用私有方法调整 c# 类?
【发布时间】:2010-11-17 02:13:28
【问题描述】:

我想给一个类适配一个私有方法,让适配器调用这个私有方法:

考虑这个类

public class Foo
{
   private void bar()
}

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

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

任何想法将不胜感激。

谢谢!

【问题讨论】:

    标签: c# command private adapter


    【解决方案1】:

    我相信有很多选择:

    • 使用带有Execute 方法的接口ICommand 而不是FooCommand。然后以实现ICommand的方式声明Foo

      public class Foo : ICommand {
          private void bar() { ... }
          void ICommand.Execute() { bar(); }
      }
      

      我相信这是最吸引人的解决方案:方法仍然可以是私有的;你不需要为每个Foo 实例化一个额外的FooCommand;并且您不需要为每个需要它的 X 类声明一个单独的 XCommand 类。

    • Foo 类中声明FooCommand 类,使其成为嵌套类。那么FooCommand就可以访问私有方法了。

    • 声明bar方法publicinternal

    • 声明bar方法protectedprotected internal,然后从Foo派生FooCommand

    • 使用反射调用私有方法(使用Type.GetMethod,后跟MethodBase.Invoke)。我相信大多数开发人员会认为这是一种肮脏的黑客攻击。

    【讨论】:

    • 谢谢,蒂姆维。我喜欢嵌套类方法,但我需要从 Foo 外部引用这个嵌套类。这可能吗?
    • @Jacko:如果它是公开的,是的,当然。
    【解决方案2】:

    您至少需要将 bar() 设为受保护而不是私有。私有函数只能由声明它们的类调用,除非您决定使用反射,然后反射对您的应用程序提出安全要求。

    【讨论】:

    • 谢谢,杰弗里。我不想从 Foo 继承,在这种情况下 protected 会很有用,而是将它包装在另一个类中。
    【解决方案3】:

    这样做的唯一方法是使用反射并以这种方式调用方法,但我强烈建议不要这样做。为什么不直接将方法设为内部?

    【讨论】:

    • 谢谢,BFree。使用 internal 会降低对这种方法的封装,所以我正在寻找一种不同的方法。
    【解决方案4】:
       public void execute()
       {
           var m = foo_.GetType().GetMethod("bar", BindingFlags.NonPublic|BindingFlags.Instance);
           m.Invoke(foo_, null);
    
       }
    

    我同意其他发帖人的观点,他们说将方法设为内部并在需要时使用 InternalsVisibleToAttribute。

    【讨论】:

    • 谢谢,普里特。但是,我对使用反射有点犹豫。
    【解决方案5】:

    您是否有权访问类 Foo 以访问修改类?如果没有,我不相信你可以从另一个类调用它的私有方法 bar()。

    【讨论】:

    • 谢谢,埃里克。我确实可以访问 Foo 类。
    猜你喜欢
    • 1970-01-01
    • 2022-06-11
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多