Как использовать отражение, чтобы определить, является ли класс внутренним? - PullRequest
27 голосов
/ 11 февраля 2011

Как следует из заголовка, как вы используете отражение, чтобы проверить, определено ли определение класса как внутреннее?«typeof (...)» возвращает некоторые свойства, показанные ниже, но не определяет, определен ли класс как внутренний.Посмотрел в Google, но все, что я мог найти, было много статей о запуске внутренних или защищенных методов с использованием рефлексии.В этом случае меня интересуют не методы, а определение класса.

var type = typeof(Customer);
Assert.IsTrue(type.IsClass);
Assert.That(type.IsAbstract, Is.EqualTo(isAbstract));
Assert.That(type.IsPublic, Is.EqualTo(isPublic));
Assert.That(type.IsPublic, Is.EqualTo(isPublic));
Assert.That(type.IsSealed, Is.EqualTo(isSealed));
Assert.That(type.IsSerializable, Is.EqualTo(isSerializable));

Ответы [ 4 ]

29 голосов
/ 11 февраля 2011

Это классический выпуск. От MSDN :

Ключевые слова C # protected и internal не имеют значения в IL и не используются в API Reflection. Соответствующие термины в IL: Family и Assembly. Чтобы определить метод internal с помощью Reflection, используйте свойство IsAssembly. Чтобы определить метод protected internal, используйте IsFamilyOrAssembly.

Отражение не раскрывает пути для Type проверки, является ли оно internal, protected или protected internal.

9 голосов
/ 11 февраля 2011

Метод IsVisible дает вам искомое значение?

6 голосов
/ 23 сентября 2017

Вот некоторые функции, которые гарантированно обеспечивают правильную видимость типа (возможно, излишнюю реализацию):

bool isPublic(Type t) {
    return
        t.IsVisible
        && t.IsPublic
        && !t.IsNotPublic
        && !t.IsNested
        && !t.IsNestedPublic
        && !t.IsNestedFamily
        && !t.IsNestedPrivate
        && !t.IsNestedAssembly
        && !t.IsNestedFamORAssem
        && !t.IsNestedFamANDAssem;
}

bool isInternal(Type t) {
    return
        !t.IsVisible
        && !t.IsPublic
        && t.IsNotPublic
        && !t.IsNested
        && !t.IsNestedPublic
        && !t.IsNestedFamily
        && !t.IsNestedPrivate
        && !t.IsNestedAssembly
        && !t.IsNestedFamORAssem
        && !t.IsNestedFamANDAssem;
}

// only nested types can be declared "protected"
bool isProtected(Type t) {
    return
        !t.IsVisible
        && !t.IsPublic
        && !t.IsNotPublic
        && t.IsNested
        && !t.IsNestedPublic
        && t.IsNestedFamily
        && !t.IsNestedPrivate
        && !t.IsNestedAssembly
        && !t.IsNestedFamORAssem
        && !t.IsNestedFamANDAssem;
}

// only nested types can be declared "private"
bool isPrivate(Type t) {
    return
        !t.IsVisible
        && !t.IsPublic
        && !t.IsNotPublic
        && t.IsNested
        && !t.IsNestedPublic
        && !t.IsNestedFamily
        && t.IsNestedPrivate
        && !t.IsNestedAssembly
        && !t.IsNestedFamORAssem
        && !t.IsNestedFamANDAssem;
}
0 голосов
/ 19 октября 2012

Эхх, я не совсем уверен, но, например,

Public Function PublicFriendOrPrivate(t As Type) As String
    If t.IsPublic Then
        Return "Public"
    Else
        If t.IsNotPublic AndAlso t.IsNested Then
            Return "Private"
        Else
            Return "Friend"
        End If
    End If
End Function

'Примечание' Друг 'равно' Внутреннему 'в C #.

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