Давайте рассмотрим следующий код:
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.