C# Mono.Cecil类型。IsAssignableFrom(derivedType)等效

C# Mono.Cecil类型。IsAssignableFrom(derivedType)等效,c#,reflection,inheritance,cil,mono.cecil,C#,Reflection,Inheritance,Cil,Mono.cecil,我正在使用Mono.Cecil查找程序集中从给定的源代码派生的类型。 通常可以用IsAssignableFrom()方法完成,但我不能确定它在Cecil中是等效的。 有没有这样的方法或其他方法来检查它? 谢谢 Mike我从来没有用Mono做过任何事情,更不用说Cecil了,但是通过GitHub的源代码,我猜你可能可以用以下类型的类型定义来做一些事情: public bool HasInterface(TypeDefinition type, string interfaceFullName) {

我正在使用Mono.Cecil查找程序集中从给定的源代码派生的类型。 通常可以用IsAssignableFrom()方法完成,但我不能确定它在Cecil中是等效的。 有没有这样的方法或其他方法来检查它? 谢谢
Mike

我从来没有用Mono做过任何事情,更不用说Cecil了,但是通过GitHub的源代码,我猜你可能可以用以下类型的
类型定义来做一些事情:

public bool HasInterface(TypeDefinition type, string interfaceFullName)
{
  return (type.Interfaces.Any(i => i.FullName.Equals(interfaceFullName)) 
          || type.NestedTypes.Any(t => HasInterface(t, interfaceFullName)));
}

查找AType类型的派生类型的一种方法是枚举程序集中定义的所有类型,并将其BaseType属性与AType类型进行比较。此方法在ILSpy中用于显示选定类型的派生类型。实现在FindDriveTypes方法()中。要查找间接派生的类型,必须迭代BaseType属性(使用Resolve()),直到到达AType或BaseType等于null。

该工具使用Mono Cecil。它可以找到使用您的类型的所有实例,包括使用命令从您的类型派生的实例

ApiChange.exe-whousestype “CommandBase”ApiChange.Api.dll-位于 ApiChange.Api.dll-excel

您将获得一个Excel输出,其中包含您所属类型的所有用户的文件和行号。看起来像

ApiChange.Api.dll   internal class ApiChange.Api.Scripting.CorFlagsCommand          Inherits from   internal class ApiChange.Api.Scripting.CommandBase  C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\CorFlagsCommand.cs  
ApiChange.Api.dll   internal class ApiChange.Api.Scripting.WhoImplementsInterfaceCommand            Inherits from   internal class ApiChange.Api.Scripting.CommandBase  C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\WhoImplementsInterfaceCommand.cs    
ApiChange.Api.dll   internal class ApiChange.Api.Scripting.DiffAssembliesCommand            Inherits from   internal class ApiChange.Api.Scripting.CommandBase  C:\Source\ApiChangeTooling\ApiChange.Api\src\Scripting\Commands\DiffAssembliesCommand.cs    
使用Cecil的实际代码位于

你的, Alois Kraus

继承检查和“分配兼容性”检查实际上是不同的事情。您想检查继承还是“分配兼容性”

赋值兼容性包括很多内容,包括有符号/无符号转换、枚举到基类型转换、
char
short
转换、通用方差转换、从接口到
对象的转换、从数组到
IList
IList
及其基接口的转换,数组协方差,约束的通用参数,还有一大堆其他的东西

最好的办法是在ECMA规范中查找分配兼容性和“验证类型兼容性”规则,以获得完整的列表

我猜,由于您的特殊需要,您可能需要一些完整“分配兼容性检查”的子集

不幸的是,Cecil没有任何方法可以为您实现这一点,但它确实为您自己实现这一点提供了足够的信息


在使用cecil实现类似的东西时,您确实需要小心。特别是TypeReference类有一个“Resolve”方法,在某些情况下需要调用该方法(用于查找未解析类型引用的类型定义),但在其他情况下不能调用该方法,因为它会在类型树中挖掘太远。您还需要处理“结构类型相等”以比较泛型实例,并且在向上遍历类型层次结构时必须处理泛型参数替换

+1。当我使用Cecil做一个项目时,我考虑过为包装这类功能的东西添加一个功能请求,但从来没有考虑过:)另外,我忘了为什么,在什么情况下,但在枚举这些属性之前,您可能必须对其中一些属性进行空检查…+1。如果能看到一些代码示例就好了。当然,如果没有详细的需求,很难推荐一种特定的方法(正如您的答案所解释的)。。。但我不能和你分享…(至少现在不能)。我想传达的要点是:(1)赋值兼容性比继承更重要,2)继承检查需要检查比你想象的更多的事情,3)你需要考虑的一切都在ECMA规范中列出,4)塞西尔API中有一些陷阱需要小心。不过我不能给你代码,不用担心。反射/低级别类型操作很难,对于这个答案(以及Cecil本身)来说,对常见情况有帮助是很好的。这个答案仍然很有用:)我想我记得我看到了一块“石头”