/// <summary>
        /// Creates a wrapper given a handle.
        /// </summary>
        /// <param name="entity">The handle of the element to be wrapped.</param>
        /// <param name="assemblyMetadata">The module hosting the handle.</param>
        /// <returns>A wrapper or null if one cannot be created.</returns>
        public static IHandleTypeNamedWrapper?Create(EntityHandle entity, AssemblyMetadata assemblyMetadata)
        {
            if (entity.IsNil)
            {
                return(null);
            }

            switch (entity.Kind)
            {
            case HandleKind.EventDefinition:
                return(EventWrapper.Create((EventDefinitionHandle)entity, assemblyMetadata));

            case HandleKind.FieldDefinition:
                return(FieldWrapper.Create((FieldDefinitionHandle)entity, assemblyMetadata));

            case HandleKind.MethodDefinition:
                return(MethodWrapper.Create((MethodDefinitionHandle)entity, assemblyMetadata));

            case HandleKind.PropertyDefinition:
                return(PropertyWrapper.Create((PropertyDefinitionHandle)entity, assemblyMetadata));

            case HandleKind.TypeDefinition:
                return(TypeWrapper.Create((TypeDefinitionHandle)entity, assemblyMetadata));

            case HandleKind.MemberReference:
                return(MemberReferenceWrapper.Create((MemberReferenceHandle)entity, assemblyMetadata));

            case HandleKind.TypeSpecification:
                var specification = TypeSpecificationWrapper.Create((TypeSpecificationHandle)entity, assemblyMetadata);
                return(specification?.Type);

            case HandleKind.InterfaceImplementation:
                return(InterfaceImplementationWrapper.Create((InterfaceImplementationHandle)entity, assemblyMetadata));

            case HandleKind.TypeReference:
                var typeWrapper = TypeReferenceWrapper.Create((TypeReferenceHandle)entity, assemblyMetadata);
                return(typeWrapper?.Type);
            }

            return(null);
        }
        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);
        }