让我们考虑以下代码:
internal class FooInternal
{
internal static void DoIt()
{
throw new NotImplementedException();
}
}
现在我有一个库,它反映了 FooInternal 类型,对于一个反映的methodInfo(在本例中是DoIt)我有这个:
if ((methodInfo.Attributes & MethodAttributes.FamANDAssem) == MethodAttributes.FamANDAssem)
{
// hits here.
}
我们可以看到我正在使用标记为FarmAndAssem的内部方法。现在,我还需要确保该方法在调用它的同一个程序集中被延迟,这样我的libary就不会在其他程序集中定义的类型的成员行中命名并标记为internal。
我不能在反映方法的库中使用Assembly.GetExecutingAssembly,因为它将返回库所在的程序集,而不是使用库声明/调用类型的程序集。
因此,代码应确保以下工作流程:
Given: FooInternal is declared in the same asssembly as the caller's assembly. When: Called with MyLib.Fake(typeof(FooInternal)); Then: It will hit the expected line.
Given: A third-party type. When: Called with MyLib.Fake(typeof(FileInfo)); Then: It will not hit the expected line even though *FileInfo* has internal methods and as such the first condition passes, because FileInfo belongs to a different assembly from caller's.
答案 0 :(得分:5)
您可以从代码所在的类型中获取程序集:this.GetType().Assembly
并将其与methodInfo.Module.Assembly
进行比较。