Inheritance FxCop TypeNode.IsDerivedFrom方法对于来自不同程序集的类型意外工作
我在程序集“A”中有基类型“base”,在程序集“B”中有派生类型“Child” 我使用FxCop在程序集中查找从“Base”派生的“B”类型,如下所示: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
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中将某些属性设置为团队标准。从前面开始,我想我有了一个解决方案,将回顾我的步骤并发布答案。