Как я могу адаптировать класс C # с закрытыми методами? - PullRequest
1 голос
/ 17 ноября 2010

Я хотел бы адаптировать класс с закрытым методом, чтобы адаптер вызывал этот закрытый метод:

Рассмотрим этот класс

public class Foo
{
   private void bar()
}

Я хотел бы класс, следующий зашаблон команды и вызывает bar () в своем методе execute:

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

Любые идеи будут высоко оценены.

Спасибо!

Ответы [ 5 ]

3 голосов
/ 17 ноября 2010

Я считаю, что есть много вариантов:

  • Вместо FooCommand используйте интерфейс ICommand с методом Execute. Затем объявите Foo таким образом, чтобы он реализовал ICommand:

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

    Я считаю, что это наиболее привлекательное решение: метод все еще может быть закрытым; вам не нужно создавать дополнительные FooCommand для каждого Foo; и вам не нужно объявлять отдельный класс XCommand для каждого X класса, который этого хочет.

  • Объявите класс FooCommand внутри класса Foo, чтобы он стал вложенным классом . Тогда FooCommand может получить доступ к приватному методу.

  • Объявите метод bar public или внутренний .

  • Объявите метод bar защищенный или защищенный внутренний и затем извлеките FooCommand из Foo.

  • Используйте Reflection для вызова приватного метода (используйте Type.GetMethod, а затем MethodBase.Invoke). Я полагаю, что большинство разработчиков сочли бы это грязным взломом.

2 голосов
/ 17 ноября 2010
   public void execute()
   {
       var m = foo_.GetType().GetMethod("bar", BindingFlags.NonPublic|BindingFlags.Instance);
       m.Invoke(foo_, null);

   }

Я согласен с другими авторами, которые говорят, что делают метод внутренним и используют InternalsVisibleToAttribute при необходимости.

2 голосов
/ 17 ноября 2010

Единственный способ сделать это - использовать рефлексию и вызвать метод таким образом, однако я настоятельно рекомендую не делать этого.Почему бы просто не сделать метод внутренним?

2 голосов
/ 17 ноября 2010

Вам нужно сделать хотя бы bar () защищенным, а не приватным.Закрытые функции могут вызываться только тем классом, который их объявляет, если только вы не решите использовать Reflection, которая затем накладывает требования безопасности на ваше приложение.

1 голос
/ 17 ноября 2010

Есть ли у вас доступ к классу Foo как при доступе для изменения класса? Если нет, я не верю, что вы можете вызвать его закрытый метод bar () из другого класса.

...