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

时间:2011-02-11 16:00:30

标签: 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));

4 个答案:

答案 0 :(得分:28)

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

  

C#关键字protectedinternal在IL中没有任何意义,并且未在Reflection API中使用。 IL中的相应术语是FamilyAssembly。要使用Reflection标识internal方法,请使用IsAssembly属性。要确定protected internal方法,请使用IsFamilyOrAssembly

反思不会在Type检查是internalprotected还是protected internal。{/ p>

答案 1 :(得分:9)

IsVisible方法是否为您提供了所需的值?

答案 2 :(得分:6)

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

@echo off
setlocal EnableDelayedExpansion

rem Set here the number of lines
set num=2

set n=0
for /F "delims=" %%a in (input.txt) do (
   set "line=%%a
   if "!line:~0,1!" equ ">" (
      if !n! gtr %num% for /L %%i in (1,1,!n!) do echo !line[%%i]!
      set n=0
   )
   set /A n+=1
   set "line[!n!]=%%a"
)
if !n! gtr %num% for /L %%i in (1,1,!n!) do echo !line[%%i]!

答案 3 :(得分: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#中等于'内部'。