【问题标题】:Is there way to know through reflection that a method is from caller's assembly?有没有办法通过反射知道一个方法来自调用者的程序集?
【发布时间】:2012-08-14 09:41:13
【问题描述】:

让我们考虑以下代码:

internal class FooInternal
{
    internal static void DoIt()
    {
        throw new NotImplementedException();
    }
}

现在我有一个库,它在其中反映 FooInternal 类型,对于反射的 methodInfo(在本例中为 DoIt)我有这个:

if ((methodInfo.Attributes & MethodAttributes.FamANDAssem) == MethodAttributes.FamANDAssem)
{
     // hits here.
}

我们可以看到我正在为标记为 FarmAndAssem 的内部方法打线。现在,我还需要确保该方法是在调用它的同一程序集中声明的,这样我的库就不会在其他程序集中定义并标记为内部的类型的成员出现在行中。

我不能在反映该方法的库中使用 Assembly.GetExecutingAssembly,因为它将返回库所在的程序集,而不是使用该库声明/调用类型的程序集。

因此,代码应确保以下工作流程:

给定: FooInternal 在与调用者程序集相同的程序集中声明。 何时:使用 MyLib.Fake(typeof(FooInternal)); 调用 然后:它将达到预期的线。 给定:第三方类型。 何时:使用 MyLib.Fake(typeof(FileInfo)); 调用 然后:即使 *FileInfo* 也不会达到预期的行 具有内部方法,因此第一个条件通过,因为 FileInfo 属于与调用者不同的程序集。

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,我想它有点不同。假设我有一个调用 MyLibrary.Fake(),在 Fake 方法中,我为 FooInternal 中的方法添加了拦截器,现在因为 DoIt 也可以从它的测试方法中使用(FarmAndAssembly),我也需要考虑这一点但是如果我使用第三方类型调用它会怎样。在这种情况下,我必须检查是否有来自调用方法的访问,在这种情况下,测试方法对目标类型的访问。
    • @Mehfuz:您可以将this.GetType() 替换为您希望作为参考点的Type 对象。在Fake<T>() 中,您可以改为使用typeof(T).Assembly 来获取Assembly,其中声明了泛型类型参数的类型。
    • @Fedrik:感谢您的回复。实际上,我已经通过 methodInfo.Module.Assembly 知道了类型,这里我需要知道的是 typeof(T).Assembly / methodInof.Module。程序集驻留在测试或调用方法所在的同一个程序集中。直到那时我将处理内部方法,因为内部方法只能(强烈)从其自己的程序集中的成员中访问。
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2011-12-14
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多