从回调的角度来看,当我知道 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 也可以从 delegate 那里得到关于爸爸的 secret 计划的信息。我是否正确理解了委托(delegate)概念或遗漏了什么?
最佳答案
你的假设是正确的。不幸的是,无论您如何尝试“封装”您的对象 - 必须始终在某处引用它,否则将无法调用它的实例方法。
作为某种反制措施,您可以将方法调用代理到 lambda 表达式:
TravelPlanDelegate myPlan = (args) =>PlanA(args);
这使得任何流氓代码都不太可能尝试对您的代码执行一些恶意操作,因为提前知道您的代码看起来如何并不会帮助它完成某件事。
请注意,这并不能确保任何事情,因为生成的委托(delegate)仍然具有一个对象的 Target 属性,该对象包含对您的引用。
足够聪明的破解者仍然可以将反射应用于生成的类并获得对您的对象的引用。
结论:
只使用您信任的代码 - 在当今开源驱动的世界中这不是什么大问题。
关于c# - 如何保护委托(delegate)实例引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704880/