メソッドが特定のクラスから呼び出された場合にのみ、メソッドを適用する FxRule を作成したいと考えています。
注:特定のクラスのメソッドにルールを適用するだけではなく、ボクシングを行う他のメソッドを呼び出す他のメソッドを呼び出すメソッドを処理できるようにしたい.
ボックス化を行うメソッドに関連する問題を FxCop に報告してもらいたいです。
以下は私がこれまで持っているコードです:
using System;
using System.Linq;
using Microsoft.FxCop.Sdk;
using System.Collections.Generic;
class CheckUpdatableComponents : BaseIntrospectionRule
{
private string[] MethodsToCheck = new string[] { "BeginDraw", "BeginRun", "Draw", "EndRun", "EndDraw", "Update" };
/// <summary>Gets the base class hooked up.</summary>
public CheckUpdatableComponents()
: base("CheckUpdatableComponents", "FxCopRules.Rules", typeof(CheckUpdatableComponents).Assembly)
{
}
public override ProblemCollection Check(string namespaceName, TypeNodeCollection types)
{
foreach (var type in types.Where(T => IsSubClassOf(T, "Microsoft.Xna.Framework.Game")))
{
foreach (var MethodToCheck in MethodsToCheck)
{
Method RunMethod = type.GetMethod(Identifier.For(MethodToCheck));
if (RunMethod != null)
{
Visit(RunMethod);
}
}
}
return Problems;
}
public override void VisitMethod(Method method)
{
Problems.Add(new Problem(GetResolution(), method, method.ToString())); // This problem only appears for each of the RunMethods, and doesn't seem to be recursing down the tree.
foreach (var Instruction in method.Instructions)
{
if (Instruction.NodeType == NodeType.Box ||
Instruction.NodeType == NodeType.Unbox ||
Instruction.NodeType == NodeType.UnboxAny ||
Instruction.OpCode == OpCode.Box ||
Instruction.OpCode == OpCode.Unbox ||
Instruction.OpCode == OpCode.Unbox_Any)
{
}
}
base.VisitMethod(method);
}
private bool IsSubClassOf(TypeNode type, string typeName)
{
if (type.FullName == typeName)
return true;
if (type.BaseType == null)
return false;
else
return IsSubClassOf(type.BaseType, typeName);
}
}
上記のコードに関する私の問題は、まず、再帰していないように見えることです。第二に、その FxCop は問題を名前空間に関連付けられていると報告します (おそらく、Check(namespace....) 部分を使用して訪問を開始したためです。
私の問題は、FxCop にボクシングの問題があるメソッドを報告してもらいたいということですが、それが特定のメソッドによって呼び出された場合にのみ、コール ツリーをたどる方法がなく、下位ノードにアクセスして確認することしかできません。出発地の問題。
誰かが前にこのようなことをしたことがありますか?
どのメソッドが特定のメソッドを呼び出しているかを調べるにはどうすればよいですか?