2017-01-06 25 views
2

IsAssembly, IsPublic, IsFamily, IsFamilyOrAssembly, IsFamilyAndAssembly 나는 이것에 관해 읽었지만 각각에 대해 이해할 수는 없다. 이상한 것은 여기 IsFamilyIsAssembly 반환 False 코드뿐만 IsFamilyOrAssembly 반환 True입니다.IsAssembly/IsFamily와 IsFamilyOrAssembly 사이의 관계

문서에서 이해하기 어려운 사람이 있으면이 속성에 대한 설명을 줄 수 있습니까? C#에서 리플렉션에 대해 읽었을 때 나는이 모든 것을 보았습니다.

public class Example 
{ 
    public void m_public() {} 
    internal void m_internal() {} 
    protected void m_protected() {} 
    protected internal void m_protected_public() {} 

    public static void Main() 
    { 
     Console.WriteLine("\n{0,-30}{1,-18}{2}", "", "IsAssembly", "IsFamilyOrAssembly"); 
     Console.WriteLine("{0,-21}{1,-18}{2,-18}{3}\n", 
      "", "IsPublic", "IsFamily", "IsFamilyAndAssembly"); 

     foreach (MethodBase m in typeof(Example).GetMethods(
      BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) 
     { 
      if (m.Name.Substring(0, 1) == "m") 
      { 
       Console.WriteLine("{0,-21}{1,-9}{2,-9}{3,-9}{4,-9}{5,-9}", 
        m.Name, 
        m.IsPublic, 
        m.IsAssembly, 
        m.IsFamily, 
        m.IsFamilyOrAssembly, 
        m.IsFamilyAndAssembly 
       ); 
      } 
     } 
    } 
} 

이 코드 예제

다음과 유사한 출력을 생성 : 회원 등급의

       IsAssembly  IsFamilyOrAssembly 
        IsPublic   IsFamily   IsFamilyAndAssembly 

m_public    True  False False False False 
m_internal   False True  False False False 
m_protected   False False True  False False 
m_protected_public False False False True  False 
+0

질문을 뒤집을 수 있습니까? 어떤 정보를 정확히 찾고 있습니까? 왜 이러한 속성이 제공 할 것이라고 생각합니까? – CodeCaster

+0

@CodeCaster 어떻게 수정해야할지 모르겠습니다. 이 기능을 알고 있어야하며 적용 할 수있는 곳과 그들 사이의 차이점은 무엇입니까 – Prabu

+1

이제 이러한 속성이 상호 배타적이며 액세스 수정 자의 특정 조합에 해당한다는 사실을 알게되었습니다. 너는 무엇을 더 알 필요가 있니? 또한 MSDN에서 코드를 복사했지만 실행하지 않은 이유는 무엇입니까? 출력이 코드와 일치하지 않습니다. – CodeCaster

답변

3

그들과 관련된 액세스 수정이 (공공, 내부, ...). 이것들은 멤버가 구현 한 객체 지향 캡슐화의 레벨을 정의합니다. here에서 자세한 내용을 확인할 수 있습니다.

반사를 사용하면 한 번 봐 가지고 할 수 있습니다 : 당신은 회원이 상속 유형에서 볼 수 있는지 확인하려는 경우

    /*Modifiers*/ 

IsPublic   public 

IsFamilyOrAssembly protected internal 

IsFamily   protected 

IsFamilyAndAssembly n/a 

IsAssembly   internal 

을, 당신은 표현식을 사용하여 확인해야합니다 (m.IsFamilyOrAssembly | m.IsFamily || m.IsFamilyAndAssembly || m.IsAssembly). 그리고 정확하게 이들 속성 중 하나만 이고 나머지는 거짓입니다.

0

이 메서드는 MethodAttributes 열거 형의 특정 열거 형 값을 확인합니다. 불행히도 이것은 다소 복잡한 enum 유형입니다.

public enum MethodAttributes 
{ 
    // NOTE: This Enum matchs the CorMethodAttr defined in CorHdr.h 

    // member access mask - Use this mask to retrieve accessibility information. 
    MemberAccessMask = 0x0007, 
    PrivateScope  = 0x0000,  // Member not referenceable. 
    Private    = 0x0001,  // Accessible only by the parent type. 
    FamANDAssem   = 0x0002,  // Accessible by sub-types only in this Assembly. 
    Assembly   = 0x0003,  // Accessibly by anyone in the Assembly. 
    Family    = 0x0004,  // Accessible only by type and sub-types.  
    FamORAssem   = 0x0005,  // Accessibly by sub-types anywhere, plus anyone in assembly. 
    Public    = 0x0006,  // Accessibly by anyone who has visibility to this scope.  
    // end member access mask 
    ... 

우리는 FamORAssemFamANDAssem는 고유 값 것을 관찰 할 수 있으며,이 Family 또는 Assembly 값에 관련되지 않은 : 우리가 검사하는 경우는 early values입니다. 혼동스럽게도이 열거 형은 Flags 특성으로 표시되지만 멤버 액세스 값에 대해서는 단순한 비트 조합이 아닙니다.