从回调的角度来看,当我知道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也可以从代表那里获得有关爸爸秘密计划的信息。我是否正确地获得了委托概念或遗漏了什么?
答案 0 :(得分:2)
你的假设是正确的。不幸的是,你试图"封装"你的对象 - 必须始终在某处引用它,否则就不可能调用它的实例方法。
作为某种对策,您可以将方法调用代理为lambda表达式:
TravelPlanDelegate myPlan = (args) =>PlanA(args);
这使得任何恶意代码都不太可能尝试在代码上执行一些错误的操作,因为事先了解代码的样子并不能帮助它完成任务。
请注意,这并不能确保一件事,因为生成的委托仍然具有一个Target属性,该属性包含对您的引用的对象。
足够聪明的破解者仍然可以对生成的类应用反射并获得对象的引用。
<强>结论:强>
只使用您信任的代码 - 在当今的开源驱动世界中,这不是一个大问题。