2011-02-11 177 views
22

正如標題所說,您如何使用反射來檢查類定義是否被定義爲內部? 「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)); 

回答

26

這是一個經典問題。從MSDN

C#的關鍵字protectedinternal在IL沒有意義,在反射API沒有使用。 IL中的相應術語是FamilyAssembly。要使用反射識別internal方法,請使用IsAssembly屬性。要識別protected internal方法,請使用IsFamilyOrAssembly

思考不上Type檢查暴露的路要走,如果它是internalprotectedprotected internal

+0

我不知道MSDN文檔是準確的,但也許我錯了。例如,我知道`Tuple <>`實現了`internal interface ITuple`。這個接口上的`Type`對於上述標誌具有`false'。在我自己的內部類上的測試表現相同。 – 2011-02-11 16:16:14

+0

此外,對我的`嵌套'讀作`class A {class B {}}`,其中`B`嵌套在`A`內。文檔特別提到的屬性`IsAssembly`,`IsFamily`不在`Type`對象上公開。 – 2011-02-11 16:21:43

6

IsVisible方法是否給你你正在尋找的價值?

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 

'Note'Friend'等於'內部'在C#中。

0

下面是保證給類型(可能是矯枉過正實現)的正確可見一些功能:

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; 
} 
相關問題