使用委托进行私有方法调用

时间:2014-05-11 04:01:41

标签: c#-4.0

我正在阅读“ CLR via C#”第4版。在代表章节(第17章)中写道

在Program类型中将FeedbackToConsole方法定义为private,但是 Counter方法可以调用Program的私有方法。在这种情况下,您可能不会期望 因为Counter和FeedbackToConsole都是以相同的类型定义的。 *然而, 即使Counter方法是在另一种类型中定义的,这段代码也能正常工作。简而言之,只要委托对象是由具有足够安全性/可访问性的代码创建的,代码就可以通过委托来调用另一个类型的私有成员,这对于一种类型不是安全性或可访问性违规。

我正在尝试使用该语句,但无法从其他类型调用私有方法。这是我的代码:

namespace DelegatesEvents
{
    class Program
    {
      public  static void Main(string[] args)
        {
            Counter(1, 2, new FeedBack(DelegateEventsDemo.FeedBackToConsole));
            Console.ReadLine();
        }

      private static void Counter(int p1, int p2, FeedBack feedBack)
      {
          for (int i = p1; i <= p2; i++)
          {
              if (feedBack != null)
              {
                  feedBack(i);
              }
          }
      }
    }
}





 namespace DelegatesEvents
{
    internal delegate void FeedBack(Int32 val);

   public class DelegateEventsDemo
    {
       private static void FeedBackToConsole(Int32 val)
       {

           Console.WriteLine("Good morning delegates" + val);
       }

    }
}

这里当我在FeedBackToConsole中声明私有辅助功能时,它无法像往常一样调用.Plz帮助我在哪里错了?

2 个答案:

答案 0 :(得分:3)

简而言之,只要委托对象由具有足够安全性/可访问性的代码创建,一种类型的安全性或可访问性违反就不会使代码通过委托调用其他类型的私有成员

DelegateEventsDemo必须创建委托对象。所以我们添加了公共GetFeedBackDelegate方法(你也可以添加属性),它返回引用私有方法的委托对象。

namespace DelegatesEvents
{
    internal delegate void FeedBack(Int32 val);

    public class DelegateEventsDemo
    {
        private static void FeedBackToConsole(Int32 val)
        {
            Console.WriteLine("Good morning delegates" + val);
        }

        internal static FeedBack GetFeedBackDelegate()
        {
            return FeedBackToConsole;
        }
    }
}

代码使用:

namespace DelegatesEvents
{
    class Program
    {
        public  static void Main(string[] args)
        {
            Counter(1, 2, DelegateEventsDemo.GetFeedBackDelegate());
            Console.ReadLine();
        }

        private static void Counter(int p1, int p2, FeedBack feedBack)
        {
            for (int i = p1; i <= p2; i++)
            {
                if (feedBack != null)
                {
                    feedBack(i);
                }
            }
        }
    }
}

答案 1 :(得分:0)

正如 Richter 和 Ulugbek 提到的,创建委托的代码需要对方法足够访问,由委托包装。委托是在 DelegateEventsDemo 中创建的,它存储引用的 FeedBackToConsole 方法。所以只要有足够的可访问性,一切都很好。