一个班级是否有可能了解反思是否已被用于自身?

时间:2013-03-11 14:29:03

标签: c# reflection

X类使用反射方法来检查Y类是否具有特定方法。是否有任何方法让Y类找出类X正在检查的方法的细节?

2 个答案:

答案 0 :(得分:5)

对Type定义执行反射而不是实例。

如果需要,该实例用于检索值,并且只是值的存储位置,Type定义是此存储区域的映射。

因此无法指示是否已在实例上使用了反射...可以确定最近是否已在类型上执行了反射(在最后一次垃圾收集器运行之前,认为反射反射)但是最好不要在这里进一步探讨,因为它仍然无法解决你想要实现的问题。

当CLR执行反射时,它会这样做,不会留下任何已执行反射的痕迹,节省了与执行反射相关的内存成本。

如果不修改CLR,就不可能留下任何此类指示。

解决此问题的另一种方法是提供一个反射缓存,它将类型信息存储在一个Dictionary中,这将允许您确定是否已反映特定类型,然后使用字典中的信息而不是执行再次反思。

请参阅How do I intercept a method call in C#?

答案 1 :(得分:2)

类Y能够知道类X反映它的唯一方法是,类X通过调用方法或设置或获取属性的值以某种方式让类Y知道。所以答案是肯定的。