Как разрешить доступ к методу только в качестве делегата, но не выполняется? - PullRequest
1 голос
/ 16 октября 2019

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

, например:

class a
{
   public delegate int myDelegate(int a);
   public static int myMethod(int data, myDelegate action)
   {
        //my code
   }

   private static int methodA(int a){ //code}
   private static int methodb(int a){ //code}
}

class b
{
   public void anotherMethod()
   {
       var doAction = new myDelegate(methodA);
       result = myMethod(8, doAction);
   }
}

, поэтому в моем примереЯ бы хотел, чтобы methodA и MethodB выполнялись только из класса a, но при этом разрешать доступ к ним, чтобы их можно было использовать в качестве делегатов для передачи в методы из класса a.

Возможно ли это вообще? в настоящее время я получаю сообщение об ошибке «methodA недоступен из-за уровня защиты»

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

То, что вы говорите, невозможно. Когда у класса есть экземпляр делегата, никто не может помешать ему вызвать его. Таким образом, если бы класс B мог передать делегат myMethod, он также мог бы вызывать этот делегат напрямую, если только methodA и methodB не нужны специальные параметры, о которых знает только A, чтобы сделатьчто-нибудь полезное.

Один из способов сделать что-то подобное - создать перечисление, называемое чем-то вроде MethodOfA, и объявить MethodA и MethodB в качестве возможных значений перечисления. В классе A объявите приватный Dictionary<MethodOfA, MyDelegate> methodDict, который записывает, что соответствует каждому значению перечисления. Затем объявите еще одну перегрузку myMethod, которая принимает MethodOfA следующим образом:

public static int myMethod(int data, MethodOfA action) 
    => myMethod(data, methodDict[action]);

Тем не менее, для меня это выглядит как плохой дизайн. Возможно, вам не нужна перегрузка myMethod(int, MyDelegate), и просто проверьте перечисление, чтобы выполнить соответствующее действие. Другая вещь, которую вы можете попробовать - это шаблон стратегии .

0 голосов
/ 16 октября 2019

Если я вас правильно понимаю, вы хотите знать, как использовать делегатов (передавать действия / функции) в качестве параметров?

Если это так, то вам следует использовать Action <> и / или Func<> как они делегаты. Ваш код может выглядеть так:

    class a
    {
        public int myMethod(int data, Func<int, int> func)
        {
            return func.Invoke(data);
        }
    }

    class b
    {
        public void anotherMethod()
        {
            var classA = new a();
            var result = classA.myMethod(8, Double);
        }

        private int Double(int i)
        {
            return i * 2;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...