/// <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); }