如何保护委托实例引用

时间:2016-11-20 13:57:39

标签: c# delegates

从回调的角度来看,当我知道myDelegate.Target包含对其包含方法的类的引用时,我面临一种奇怪的情况。 (我在SO上搜索过它,但是如果我错过了一些已经回答过这个问题的话,我会原谅)

例如

public delegate void TravePlanDelegate();

public class Traveller
{
   //Papa is planing a tour, along with Mama 
   public void Planner()
   {
       //Asking me (delegate) to hold a letter about PlanA's detail
       TravelPlanDelegate myPlan = PlanA;
       //Sending me to TravelAgency office with letter 
       new TravelAgency().ExecuteTravelPlan(myPlan);
   }
   public void PlanA()
   {
         //Papa's open plan with Mama
         Console.WriteLine("First Berline, then New Yark and finally Lahore");
   }
   public void PlanB()
   {
        //Papa's secret plan
        Console.WriteLine("First Dubai, and then Lahore");
   }
}

public class TravelAgency
{
   public void ExecuteTravelPlan(TravePlanDelegate tp)
   {
        Traveller traveller = (Traveller)tp.Target;
       //Here it should execute plan
       //tp.Target - A reference to Traveler class, which can lead travel
       //agency to Papa's secret plan (And exposes it to Mama)
   }
}

在这个例子中,TravelAgency也可以从代表那里获得有关爸爸秘密计划的信息。我是否正确地获得了委托概念或遗漏了什么?

1 个答案:

答案 0 :(得分:2)

你的假设是正确的。不幸的是,你试图"封装"你的对象 - 必须始终在某处引用它,否则就不可能调用它的实例方法。

作为某种对策,您可以将方法调用代理为lambda表达式:

TravelPlanDelegate myPlan = (args) =>PlanA(args);

这使得任何恶意代码都不太可能尝试在代码上执行一些错误的操作,因为事先了解代码的样子并不能帮助它完成任务。

请注意,这并不能确保一件事,因为生成的委托仍然具有一个Target属性,该属性包含对您的引用的对象。

足够聪明的破解者仍然可以对生成的类应用反射并获得对象的引用。

<强>结论:

只使用您信任的代码 - 在当今的开源驱动世界中,这不是一个大问题。