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

Inheritance FxCop TypeNode.IsDerivedFrom方法对于来自不同程序集的类型意外工作,inheritance,fxcop,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

我在程序集“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”类型

这是预期的,因为这些类型节点是不同的对象,但深入到名称属性中 它们具有相同的UniqueKey和Name-我希望FxCop通过这些属性对IsDerivedMethod中的类型执行比较。但它不起作用


解决此问题的选项有哪些?

如果类型通过引用关联,则应执行以下操作:

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;
    }
公共覆盖问题集合检查(类型节点类型)
{
var winFormsReference=type.DeclaringModule.ContainingAssembly.AssemblyReferences
.SingleOrDefault(ar=>ar.Assembly.Name.StartsWith(“System.Windows.Forms”);
如果(winFormsReference==null)
返回null;
var controlType=winFormsReference.Assembly.Types.Single(t=>t.FullName==“System.Windows.Forms.Control”);
_currentTypeFullName=type.FullName;
如果(type.IsDerivedFrom(controlType)==false | | | |你应该检查type(type)==false)
返回null;
var initializer=type.Members.OfType().SingleOrDefault(x=>x.Name.Name==“InitializeComponent”);
if(初始值设定项==null)
添加(新问题(NotSetResolution(),type));
其他的
VisitMethod(初始化器);
退货问题;
}

这就是我用来查找从System.Windows.Forms.Control继承的所有类的方法,然后确保在
InitializeComponent()

+1中将某些属性设置为团队标准。从前面开始,我想我有了一个解决方案,将回顾我的步骤并发布答案。