如何使用反射来确定一个类是否是内部的?

Pau*_*eld 27 c# reflection

正如标题所说,如何使用反射检查类定义是否定义为内部?"typeof(...)"返回下面显示的某些属性,但不返回类是否定义为内部属性.看了谷歌,但我能找到的很多关于使用反射运行内部或受保护方法的文章.这不是我对这种情况感兴趣的方法,而是类定义.

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));
Run Code Online (Sandbox Code Playgroud)

jas*_*son 29

这是一个经典问题.来自MSDN:

C#的关键字protected,并internal在IL没有意义,在反射API没有使用.IL中的相应术语是FamilyAssembly.要internal使用Reflection 标识方法,请使用该IsAssembly属性.要识别protected internal方法,请使用IsFamilyOrAssembly.

反射不会暴露Type检查方式,如果是internal,protectedprotected internal.

  • 主要感谢@Jason快速而详细的回答.感谢其他人的进一步细节.在获得答案时,Stack Overflow真的是狗! (3认同)
  • @AnthonyPegram 对于非嵌套类型,即作为命名空间的直接成员且不包含在外部类/结构中的类型,可能有两个级别。在反射中,它们对应于 `IsPublic` 和 `IsNotPublic` 属性。对于 _all_ 嵌套类型,这些属性返回 false。对于嵌套类型,请使用“IsNestedFamOrAssem”、“IsNestedPrivate”等属性(均以“IsNested...”开头)。 (3认同)

Joh*_*ner 9

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


gnu*_*aru 6

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

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;
}
Run Code Online (Sandbox Code Playgroud)