Quiero escribir una regla que fallará si se hace una asignación de objeto dentro de cualquier método llamado por un método marcado con un atributo particular.Determinar si un método llama a un método en otro ensamblado que contiene una nueva declaración y viceversa
Tengo esto funcionando hasta ahora, iterando todos los métodos que llaman a mi método para verificar usando CallGraph.CallersFor()
, para ver si alguno de esos métodos padre tiene el atributo.
Esto funciona para verificar los métodos principales dentro del mismo ensamblaje que el método a verificar; sin embargo, leyendo en línea, parece que en un momento CallGraph.CallersFor()
sí miró todos los ensamblajes, pero ahora no.
Pregunta: ¿Hay alguna manera de obtener una lista de métodos que invocan un método determinado, incluidos los que están en un ensamblaje diferente?
Respuesta alternativa: Si lo anterior no es posible, ¿cómo recorro todos los métodos invocados por un método determinado, incluidos los de un ensamblaje diferente?
Ejemplo:
-----In Assembly A
public class ClassA
{
public MethodA()
{
MethodB();
}
public MethodB()
{
object o = new object(); // Allocation i want to break the rule
// Currently my rule walks up the call tree,
// checking for a calling method with the NoAllocationsAllowed attribute.
// Problem is, because of the different assemblies,
// it can't go from ClassA.MethodA to ClassB.MethodB.
}
}
----In Assembly B
public var ClassAInstance = new ClassA();
public class ClassB
{
[NoAllocationsAllowed] // Attribute that kicks off the rule-checking.
public MethodA()
{
MethodB();
}
public MethodB()
{
ClassAInstance.MethodA();
}
}
Realmente no importa donde la regla informa del error, en esta etapa consiguiendo el error es suficiente.
no estoy seguro de que realmente entiendo lo que estás tratando de verificar. ¿Podrían presentar un ejemplo concreto de código que debe generar una infracción de regla? –
@Nicole: Ed ited –