我们正在开发一个基于Unity3D的大型视频游戏,我们已经开始担心由于某些不良事件用户处理导致的重大内存泄漏。遗憾的是,我们无法附加任何流行的C#剖析器来确定内存泄漏的根本原因。
我们认为,在我们的事件系统中确定是否存在松散结束的一种快速方法是编写一个我们可以在运行时运行的快速方法,以使用当前订阅者的数量导出所有对象中的所有Action属性。
这里的希望是,我们很快就能在一些事件中看到一些巨大的数字,并且可以快速识别缺失的部分 - =取消订阅。
我在这里的问题是:有没有办法迭代所有对象来收集所有事件处理程序并计算其订阅者?
我已经快速开始迭代我们的单位。但是我喜欢这种类型通用的方法,因为我们在游戏中有很多派生类型。
public static object ExportAllEvents(params string[] args)
{
foreach (var wUnit in GameData.LEVEL.getUnits())
{
foreach (var eventInfo in wUnit.GetType().GetEvents())
{
// Hrmmm...
}
}
// TODO: CSV export here
return "Success";
}
答案 0 :(得分:0)
嗯,这里已经回答了: How to get a delegate object from an EventInfo? 基本上,给定一个EventInfo,你需要得到它的FieldInfo FieldInfo的GetValue是Delegate =)