Пример #1
0
        private bool DoesTypeHaveNonNullableContext(Type type, NonNullabilityConventionState state)
        {
            if (state.TypeCache.TryGetValue(type, out var cachedTypeNonNullable))
            {
                return(cachedTypeNonNullable);
            }

            if (Attribute.GetCustomAttributes(type)
                .FirstOrDefault(a => a.GetType().FullName == NullableContextAttributeFullName) is Attribute contextAttr)
            {
                var attributeType = contextAttr.GetType();

                if (attributeType != state.NullableContextAttrType)
                {
                    state.NullableContextFlagFieldInfo = attributeType.GetField("Flag");
                    state.NullableContextAttrType      = attributeType;
                }

                if (state.NullableContextFlagFieldInfo?.GetValue(contextAttr) is byte flag)
                {
                    return(state.TypeCache[type] = flag == 1);
                }
            }
            else if (type.IsNested)
            {
                return(state.TypeCache[type] = DoesTypeHaveNonNullableContext(type.DeclaringType !, state));
            }

            return(state.TypeCache[type] = false);
        }
        private byte?GetNullabilityContextFlag(NonNullabilityConventionState state, Attribute[] attributes)
        {
            if (attributes.FirstOrDefault(a => a.GetType().FullName == NullableContextAttributeFullName) is Attribute attribute)
            {
                var attributeType = attribute.GetType();

                if (attributeType != state.NullableContextAttrType)
                {
                    state.NullableContextFlagFieldInfo = attributeType.GetField("Flag");
                    state.NullableContextAttrType      = attributeType;
                }

                if (state.NullableContextFlagFieldInfo?.GetValue(attribute) is byte flag)
                {
                    return(flag);
                }
            }

            return(null);
        }