有没有办法通过反思知道一个方法是来自调用者的汇编?

时间:2010-08-18 11:12:55

标签: c# .net reflection

让我们考虑以下代码:

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.

1 个答案:

答案 0 :(得分:5)

您可以从代码所在的类型中获取程序集:this.GetType().Assembly并将其与methodInfo.Module.Assembly进行比较。