Je souhaite écrire une règle qui échouera si une allocation d'objet est effectuée dans une méthode appelée par une méthode marquée avec un attribut particulier.Déterminer si une méthode appelle une méthode dans un autre assembly contenant une nouvelle instruction et vice-versa
Je l'ai fait jusqu'à présent, en itérant toutes les méthodes appelant ma méthode pour vérifier en utilisant CallGraph.CallersFor()
, pour voir si l'une de ces méthodes parentes a l'attribut.
Cela fonctionne pour vérifier les méthodes parentes dans le même assemblage que la méthode à vérifier. Cependant, en lisant en ligne, il semble qu'à un moment, CallGraph.CallersFor()
a examiné tous les assemblages, mais ce n'est plus le cas.
Question: Existe-t-il un moyen d'obtenir une liste de méthodes qui appellent une méthode donnée, y compris celles d'un assemblage différent?
Autre réponse: Si ce qui précède n'est pas possible, comment parcourir toutes les méthodes appelées par une méthode donnée, y compris celles d'un assemblage différent.
Exemple:
-----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();
}
}
Cela ne me dérange pas vraiment où la règle signale l'erreur, à ce stade devient l'erreur est suffisant.
Je ne suis pas sûr que je comprends vraiment ce que vous essayez de vérifier. Pourriez-vous s'il vous plaît donner un exemple concret de code qui devrait générer une violation de règle? –
@Nicole: Ed ité. –