正如标题所说,你如何使用反射来检查类定义是否被定义为内部? “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));
答案 0 :(得分:28)
这是一个经典问题。来自MSDN:
C#关键字
protected
和internal
在IL中没有任何意义,并且未在Reflection API中使用。 IL中的相应术语是Family
和Assembly
。要使用Reflection标识internal
方法,请使用IsAssembly
属性。要确定protected internal
方法,请使用IsFamilyOrAssembly
。
反思不会在Type
检查是internal
,protected
还是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#中等于'内部'。