Настраиваемое правило в FxCop, которое применяется только к методам, вызываемым методом определенного типа

Я хочу создать FxRule, которое применяет метод, только если метод вызывается из конкретный класс.

ПРИМЕЧАНИЕ: я не хочу просто применять правило к методу определенного класса, я хочу иметь возможность обрабатывать методы, вызывающие другие методы, вызывающие другие методы, которые выполняют упаковку.

I Я бы хотел, чтобы 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 сообщил о методе, который имеет бокс как проблема, но только если он вызывается определенным методом, однако у меня нет возможности пройти вверх по дереву вызовов, я могу посещать только нижние узлы, чтобы проверить наличие проблем с моим начальным местоположением.

Кто-нибудь делал такой вид из вещей раньше?

Как я могу узнать, какие методы вызывают данный метод?

5
задан David Gardiner 19 July 2014 в 12:41
поделиться