IsAssembly / IsFamily 和 IsFamilyOrAssembly 之间的关系

Pra*_*abu 3 .net c# assemblies system.reflection .net-assembly

IsAssembly, IsPublic, IsFamily, IsFamilyOrAssembly, IsFamilyAndAssembly我已经阅读过相关内容,但我无法理解每个人的作用。这里奇怪的是IsFamily,在代码中返回并IsAssembly返回False,但IsFamilyOrAssembly返回True.

有人可以解释每个属性,因为我发现从文档中很难理解。当我开始阅读 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
                );
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码示例生成类似于以下内容的输出:

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

Ha *_*ang 5

类的成员具有与其关联的访问修饰符(公共、内部……)。这些定义了成员实现的面向对象封装的级别。您可以在此处找到更多详细信息。

使用反射,你可能想看看:

                    /*Modifiers*/

IsPublic            public

IsFamilyOrAssembly  protected internal

IsFamily            protected

IsFamilyAndAssembly private protected (since C# 7.2)

IsAssembly          internal
Run Code Online (Sandbox Code Playgroud)

如果要确定成员在继承类型中是否可见,则需要使用表达式 ( m.IsFamilyOrAssembly || m.IsFamily || m.IsFamilyAndAssembly || m.IsAssembly ) 进行检查。并且这些属性中只有一个是真的,所有其他的都是假的