Есть ли способ узнать через отражение, что метод из сборки вызывающего? - PullRequest
0 голосов
/ 18 августа 2010

Давайте рассмотрим следующий код:

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

Теперь у меня есть библиотека, внутри которой он отражает тип FooInternal , и для отраженного методаInfo (в данном случае DoIt) у меня естьthis:

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

Мы видим, что я нажимаю на строку для внутреннего метода, помеченного как FarmAndAssem.Теперь мне также нужно убедиться, что метод вызывается в той же сборке, откуда он вызывается, чтобы моя библиотека не заканчивала тем, что не попала в строку для элементов типа, определенного в другой сборке и помеченного как внутренняя.

Я не могу использовать 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 Ответ

5 голосов
/ 18 августа 2010

Вы можете получить сборку из типа, в котором ваш код: this.GetType().Assembly и сравнить его с methodInfo.Module.Assembly.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...