如何使用反射来判断一个类是否是内部类?

问题描述 投票:0回答:4

正如标题所说,如何使用反射来检查类定义是否定义为

internal

typeof(...)
返回如下所示的某些属性,但不返回类是否定义为
internal
。在 Google 上查找,但我能找到的只是很多关于使用反射运行
internal
protected
方法的文章。

我对本例感兴趣的不是方法,而是类定义。

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));
c# reflection
4个回答
38
投票

这是一个经典问题。来自MSDN

C# 关键字

protected
internal
在 IL 中没有任何意义,并且不在 Reflection API 中使用。 IL 中对应的术语是
Family
Assembly
。要使用反射识别
internal
方法,请使用
IsAssembly
属性。要识别
protected internal
方法,请使用
IsFamilyOrAssembly

反射不会暴露

Type
上的路径,检查它是否为
internal
protected
protected internal


13
投票

IsVisible方法是否为您提供了您正在寻找的值?


10
投票

以下是一些保证提供类型正确可见性的函数(可能是一个过度的实现):

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
投票

呃,我不太确定,但是例如

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# 中'Friend' 等于 'Internal'。

© www.soinside.com 2019 - 2024. All rights reserved.