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

Meh*_*fuz 0 .net c# reflection

我们考虑以下代码:

internal class FooInternal
{
    internal static void DoIt()
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个库,里面反映了FooInternal类型,对于一个反映的methodInfo(在这种情况下是DoIt)我有这个:

if ((methodInfo.Attributes & MethodAttributes.FamANDAssem) == MethodAttributes.FamANDAssem)
{
     // hits here.
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到我正在使用标记为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.

Fre*_*örk 5

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