FxCop TypeNode.IsDerivedFrom方法对来自不同程序集的类型意外工作

时间:2010-07-09 13:21:38

标签: inheritance fxcop

我在程序集“A”中有基类型“Base”,在程序集“B”中有派生类型“Child”。

我正在使用FxCop来查找从“Base”派生的程序集“B”类型,如下所示:

var baseAssemblyNode = AssemblyNode.GetAssembly("A.dll"), true, true, false);
var baseType = baseAssemblyNode.Types.Single(t => t.Name.Name == "Base");

var assemblyNode = AssemblyNode.GetAssembly("B.dll"), true, true, false); 
var derivedTypes = assemblyNode.Types.Where(t => t.IsDerivedFrom(baseType));

但结果集合是空的。

我手动找到了“Child”类型,发现它的基本类型不等于找到“Base”类型。

预计这些类型节点是不同的对象,但在Name属性中有深度 它们具有相同的UniqueKey和Name - 我希望FxCop通过这些属性对IsDerivedMethod中的类型进行比较。但它不起作用。

有什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果类型与引用相关,那么应该这样做:

public override ProblemCollection Check(TypeNode type)
    {
        var winFormsReference=type.DeclaringModule.ContainingAssembly.AssemblyReferences
            .SingleOrDefault(ar => ar.Assembly.Name.StartsWith("System.Windows.Forms"));
        if (winFormsReference==null)
            return null;
        var controlType=winFormsReference.Assembly.Types.Single(t => t.FullName=="System.Windows.Forms.Control");
        _currentTypeFullName=type.FullName;
        if (type.IsDerivedFrom(controlType)==false||_shouldCheckType(type)==false)
            return null;

        var initializer = type.Members.OfType<Method>( ).SingleOrDefault(x => x.Name.Name=="InitializeComponent");
        if (initializer==null)
            Problems.Add(new Problem(NotSetResolution( ), type));
        else
            VisitMethod(initializer);
        return Problems;
    }

这是我用来查找从System.Windows.Forms.Control继承的所有类,然后确保将某些属性设置为InitializeComponent()中的团队标准。