C# IsAssembly/IsFamily与IsFamilyAssembly之间的关系
C# IsAssembly/IsFamily与IsFamilyAssembly之间的关系,c#,.net,.net-assembly,assemblies,system.reflection,C#,.net,.net Assembly,Assemblies,System.reflection,IsAssembly、IsPublic、IsFamily、IsFamilyOrAssembly、IsFamily和daassembly我已经读过这方面的内容,但我无法理解每一个都做了什么。奇怪的是,IsFamily和IsAssembly在代码中返回False,但IsFamilyOrAssembly返回True 有人能解释一下这些属性吗?因为我觉得从文档中很难理解。我在开始阅读c#中的反射时遇到了这些问题 此代码示例生成类似以下内容的输出: 类的成员具有与其关联的访问修饰符(公共、内部等)。这些定
IsAssembly、IsPublic、IsFamily、IsFamilyOrAssembly、IsFamily和daassembly
我已经读过这方面的内容,但我无法理解每一个都做了什么。奇怪的是,IsFamily
和IsAssembly
在代码中返回False
,但IsFamilyOrAssembly
返回True
有人能解释一下这些属性吗?因为我觉得从文档中很难理解。我在开始阅读c#中的反射时遇到了这些问题
此代码示例生成类似以下内容的输出:
类的成员具有与其关联的访问修饰符(公共、内部等)。这些定义了由成员实现的面向对象封装的级别。您可以在上找到更多详细信息 使用反射,您可能需要查看:
/*Modifiers*/
IsPublic public
IsFamilyOrAssembly protected internal
IsFamily protected
IsFamilyAndAssembly private protected (since C# 7.2)
IsAssembly internal
当您想确定某个成员在继承类型中是否可见时,需要使用表达式(m.IsFamilyOrAssembly|124;m.IsFamily|124;m.isfamilyDassembly|m.IsAssembly)进行检查。这些属性中只有一个是true,其他所有属性都是false这些方法检查枚举中的某些枚举值。不幸的是,这是一个相当复杂的枚举类型。如果我们检查它:
我们可以观察到,
FamORAssem
和FamANDAssem
是不同的值,它们与系列
或组件
值无关。令人困惑的是,这个枚举用标志
属性标记,但是当涉及到成员访问值时,它们不是简单的按位组合。你能把这个问题颠倒过来吗?你到底在寻找什么样的信息,为什么你认为这些属性会提供这些信息?@CodeCaster我不知道如何修改它。我需要知道它的功能,在哪里可以应用,它们之间有什么区别。你现在发现这些属性是互斥的,对应于访问修饰符的某些组合。你还需要知道什么?另外,为什么您要从MSDN复制代码,但不运行它?输出与代码不匹配。
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
/*Modifiers*/
IsPublic public
IsFamilyOrAssembly protected internal
IsFamily protected
IsFamilyAndAssembly private protected (since C# 7.2)
IsAssembly internal
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
...