Подтвердить что ты не робот

Как использовать отражение, чтобы определить, является ли класс внутренним?

Как гласит название, как вы используете отражение, чтобы проверить, определено ли определение класса как внутреннее? "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));
4b9b3361

Ответ 1

Это классическая проблема. Из MSDN:

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

Отражение не показывает способ Type проверить, есть ли он internal, protected или protected internal.

Ответ 2

Предоставляет ли метод IsVisible значение, которое вы ищете?

Ответ 3

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

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

'Примечание' Friend 'равно' Internal 'в С#.

Ответ 4

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

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;
}