private GenericParameterWrapper(AssemblyMetadata assemblyMetadata, IHandleTypeNamedWrapper owner, GenericParameterHandle handle, GenericParameterAttributes genericParameterAttribute)
        {
            AssemblyMetadata           = assemblyMetadata;
            Owner                      = owner;
            Handle                     = handle;
            _genericParameterAttribute = genericParameterAttribute;
            GenericParameter           = assemblyMetadata.MetadataReader.GetGenericParameter(handle);

            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(GenericParameter.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _parent     = new Lazy <IHandleTypeNamedWrapper?>(() => WrapperFactory.Create(GenericParameter.Parent, assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _name       = new Lazy <string>(() => GenericParameter.Name.GetName(assemblyMetadata));
            switch (genericParameterAttribute & GenericParameterAttributes.VarianceMask)
            {
            case GenericParameterAttributes.Contravariant:
                Variance = VarianceType.Contravariant;
                break;

            case GenericParameterAttributes.Covariant:
                Variance = VarianceType.Covariant;
                break;

            default:
                Variance = VarianceType.Invariant;
                break;
            }

            _constraints = new Lazy <IReadOnlyList <GenericParameterConstraintWrapper> >(() => GenericParameterConstraintWrapper.CreateChecked(GenericParameter.GetConstraints(), this, AssemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
        }
        private ModuleDefinitionWrapper(ModuleDefinition moduleDefinition, AssemblyMetadata assemblyMetadata)
        {
            AssemblyMetadata = assemblyMetadata;
            ModuleDefinition = moduleDefinition;

            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(ModuleDefinition.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _name       = new Lazy <string>(() => moduleDefinition.Name.GetName(assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            Generation  = ModuleDefinition.Generation;

            _generationId     = new Lazy <Guid>(() => assemblyMetadata.MetadataReader.GetGuid(ModuleDefinition.GenerationId), LazyThreadSafetyMode.PublicationOnly);
            _baseGenerationId = new Lazy <Guid>(() => assemblyMetadata.MetadataReader.GetGuid(ModuleDefinition.BaseGenerationId), LazyThreadSafetyMode.PublicationOnly);
            _mvid             = new Lazy <Guid>(() => assemblyMetadata.MetadataReader.GetGuid(ModuleDefinition.Mvid), LazyThreadSafetyMode.PublicationOnly);
        }
Example #3
0
        private FieldWrapper(FieldDefinitionHandle handle, AssemblyMetadata assemblyMetadata)
        {
            FieldDefinitionHandle = handle;
            AssemblyMetadata      = assemblyMetadata;
            Handle     = handle;
            Definition = Resolve();

            _declaringType = new Lazy <TypeWrapper>(() => TypeWrapper.CreateChecked(Definition.GetDeclaringType(), AssemblyMetadata), LazyThreadSafetyMode.PublicationOnly);

            _name       = new Lazy <string>(() => Definition.Name.GetName(assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(Definition.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);

            _defaultValue = new Lazy <object?>(() => Definition.GetDefaultValue().ReadConstant(assemblyMetadata));
            IsStatic      = (Definition.Attributes & FieldAttributes.Static) != 0;

            _longEnumValue = new Lazy <ulong>(() => Convert.ToUInt64(DefaultValue, CultureInfo.InvariantCulture), LazyThreadSafetyMode.PublicationOnly);

            _fieldType = new Lazy <IHandleTypeNamedWrapper>(() => Definition.DecodeSignature(assemblyMetadata.TypeProvider, new GenericContext(DeclaringType)), LazyThreadSafetyMode.PublicationOnly);

            switch (Definition.Attributes & FieldAttributes.FieldAccessMask)
            {
            case FieldAttributes.Public:
                Accessibility = EntityAccessibility.Public;
                break;

            case FieldAttributes.FamANDAssem:
                Accessibility = EntityAccessibility.PrivateProtected;
                break;

            case FieldAttributes.Assembly:
                Accessibility = EntityAccessibility.Internal;
                break;

            case FieldAttributes.Family:
                Accessibility = EntityAccessibility.Protected;
                break;

            case FieldAttributes.FamORAssem:
                Accessibility = EntityAccessibility.ProtectedInternal;
                break;

            default:
                Accessibility = EntityAccessibility.Private;
                break;
            }

            IsReadOnly = (Definition.Attributes & FieldAttributes.InitOnly) != 0;
            IsConst    = (Definition.Attributes & FieldAttributes.Literal) != 0;
        }
        internal AssemblyWrapper(AssemblyDefinition reference, AssemblyMetadata assemblyMetadata)
        {
            Definition        = reference;
            _name             = new Lazy <string>(() => assemblyMetadata.MetadataReader.GetString(Definition.Name), LazyThreadSafetyMode.PublicationOnly);
            _culture          = new Lazy <string>(GetCulture, LazyThreadSafetyMode.PublicationOnly);
            Version           = Definition.Version;
            _assemblyName     = new Lazy <AssemblyName>(() => Definition.GetAssemblyName(), LazyThreadSafetyMode.PublicationOnly);
            CompilationModule = assemblyMetadata;

            HashAlgorithm = Definition.HashAlgorithm;

            _publicKey       = new Lazy <string>(() => Definition.PublicKey.CalculatePublicKeyToken(assemblyMetadata, HashAlgorithm), LazyThreadSafetyMode.PublicationOnly);
            _fullName        = new Lazy <string>(GetFullName, LazyThreadSafetyMode.PublicationOnly);
            IsWindowsRuntime = (Definition.Flags & AssemblyFlags.WindowsRuntime) != 0;

            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(Definition.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
        }
        private ParameterWrapper(ParameterHandle handle, IHandleTypeNamedWrapper typeWrapper, AssemblyMetadata assemblyMetadata)
        {
            AssemblyMetadata = assemblyMetadata;
            ParameterHandle  = handle;
            Handle           = handle;
            Definition       = Resolve(handle, assemblyMetadata);

            _name       = new Lazy <string>(() => Definition.Name.GetName(assemblyMetadata).GetKeywordSafeName(), LazyThreadSafetyMode.PublicationOnly);
            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(Definition.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);

            ParameterType = typeWrapper;

            Optional        = (Definition.Attributes & ParameterAttributes.Optional) != 0;
            HasDefaultValue = (Definition.Attributes & ParameterAttributes.HasDefault) != 0;

            _defaultValue  = new Lazy <object?>(() => !HasDefaultValue ? null : Definition.GetDefaultValue().ReadConstant(assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _referenceKind = new Lazy <ParameterReferenceKind>(GetReferenceKind, LazyThreadSafetyMode.PublicationOnly);
        }
        private PropertyWrapper(PropertyDefinitionHandle handle, AssemblyMetadata assemblyMetadata)
        {
            PropertyDefinitionHandle = handle;
            AssemblyMetadata         = assemblyMetadata;
            Handle     = handle;
            Definition = Resolve();

            _name       = new Lazy <string>(() => Definition.Name.GetName(assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _attributes = new Lazy <IReadOnlyList <AttributeWrapper> >(() => AttributeWrapper.CreateChecked(Definition.GetCustomAttributes(), assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);

            _getterMethod = new Lazy <MethodWrapper?>(() => MethodWrapper.Create(Definition.GetAccessors().Getter, assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);
            _setterMethod = new Lazy <MethodWrapper?>(() => MethodWrapper.Create(Definition.GetAccessors().Setter, assemblyMetadata), LazyThreadSafetyMode.PublicationOnly);

            _anyAccessor = new Lazy <MethodWrapper>(GetAnyAccessor, LazyThreadSafetyMode.PublicationOnly);

            _declaringType = new Lazy <TypeWrapper>(() => AnyAccessor.DeclaringType, LazyThreadSafetyMode.PublicationOnly);

            _accessibility = new Lazy <EntityAccessibility>(GetAccessibility, LazyThreadSafetyMode.PublicationOnly);

            _signature = new Lazy <MethodSignature <IHandleTypeNamedWrapper> >(() => Definition.DecodeSignature(assemblyMetadata.TypeProvider, new GenericContext(this)), LazyThreadSafetyMode.PublicationOnly);
        }
        /// <summary>
        /// If there is a attribute wrapper matching the known attribute get that wrapper.
        /// </summary>
        /// <param name="attributes">The collection of attributes to check.</param>
        /// <param name="type">The type of attribute we want to find.</param>
        /// <param name="wrapper">Output value of the attribute if found.</param>
        /// <returns>If the attribute was found or not.</returns>
        public static bool TryGetKnownAttribute(this IEnumerable <AttributeWrapper> attributes, KnownAttribute type, out AttributeWrapper wrapper)
        {
            if (attributes == null)
            {
                throw new ArgumentNullException(nameof(attributes));
            }

            foreach (var customAttribute in attributes)
            {
                if (customAttribute.KnownAttributeType == type)
                {
                    wrapper = customAttribute;
                    return(true);
                }
            }

            wrapper = default !;