internal IEnumerable <Attribute> BuildTypeAttributes(Type type) { var attributes = new List <Attribute>(); if (this._typeExportBuilders != null) { bool isConfigured = type.GetTypeInfo().GetFirstAttribute <ExportAttribute>() != null || MemberHasExportMetadata(type.GetTypeInfo()); if (isConfigured) { CompositionTrace.Registration_TypeExportConventionOverridden(type); } else { foreach (var export in this._typeExportBuilders) { export.BuildAttributes(type, ref attributes); } } } if (this._isShared) { // Check if there is already a SharedAttribute. If found Trace a warning and do not add this Shared // otherwise add new one bool isConfigured = type.GetTypeInfo().GetFirstAttribute <SharedAttribute>() != null; if (isConfigured) { CompositionTrace.Registration_PartCreationConventionOverridden(type); } else { attributes.Add(this._sharingBoundary == null ? new SharedAttribute() : new SharedAttribute(this._sharingBoundary)); } } //Add metadata attributes from direct specification if (this._metadataItems != null) { bool isConfigured = type.GetTypeInfo().GetFirstAttribute <PartMetadataAttribute>() != null; if (isConfigured) { CompositionTrace.Registration_PartMetadataConventionOverridden(type); } else { foreach (var item in this._metadataItems) { attributes.Add(new PartMetadataAttribute(item.Item1, item.Item2)); } } } //Add metadata attributes from func specification if (this._metadataItemFuncs != null) { bool isConfigured = type.GetTypeInfo().GetFirstAttribute <PartMetadataAttribute>() != null; if (isConfigured) { CompositionTrace.Registration_PartMetadataConventionOverridden(type); } else { foreach (var item in this._metadataItemFuncs) { var name = item.Item1; var value = (item.Item2 != null) ? item.Item2(type) : null; attributes.Add(new PartMetadataAttribute(name, value)); } } } if (this._interfaceExports.Any()) { if (this._typeExportBuilders != null) { bool isConfigured = type.GetTypeInfo().GetFirstAttribute <ExportAttribute>() != null || MemberHasExportMetadata(type.GetTypeInfo()); if (isConfigured) { CompositionTrace.Registration_TypeExportConventionOverridden(type); } else { foreach (var iface in type.GetTypeInfo().ImplementedInterfaces) { if (iface == typeof(IDisposable)) { continue; } // Run through the export specifications see if any match foreach (var exportSpecification in this._interfaceExports) { if (exportSpecification.Item1 != null && exportSpecification.Item1(iface)) { ExportConventionBuilder exportBuilder = new ExportConventionBuilder(); exportBuilder.AsContractType(iface); if (exportSpecification.Item2 != null) { exportSpecification.Item2(iface, exportBuilder); } exportBuilder.BuildAttributes(iface, ref attributes); } } } } } } return(attributes); }
internal IEnumerable <Attribute> BuildTypeAttributes(Type type) { var attributes = new List <Attribute>(); if (_typeExportBuilders != null) { bool isConfigured = type.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null || MemberHasExportMetadata(type); if (isConfigured) { CompositionTrace.Registration_TypeExportConventionOverridden(type); } else { foreach (ExportBuilder export in _typeExportBuilders) { export.BuildAttributes(type, ref attributes); } } } if (_setCreationPolicy) { // Check if there is already a PartCreationPolicyAttribute // If found Trace a warning and do not add the registered part creationpolicy // otherwise add new one bool isConfigured = type.GetCustomAttributes(typeof(PartCreationPolicyAttribute), false).FirstOrDefault() != null; if (isConfigured) { CompositionTrace.Registration_PartCreationConventionOverridden(type); } else { attributes.Add(new PartCreationPolicyAttribute(_creationPolicy)); } } //Add metadata attributes from direct specification if (_metadataItems != null) { bool isConfigured = type.GetCustomAttributes(typeof(PartMetadataAttribute), false).FirstOrDefault() != null; if (isConfigured) { CompositionTrace.Registration_PartMetadataConventionOverridden(type); } else { foreach (Tuple <string, object> item in _metadataItems) { attributes.Add(new PartMetadataAttribute(item.Item1, item.Item2)); } } } //Add metadata attributes from func specification if (_metadataItemFuncs != null) { bool isConfigured = type.GetCustomAttributes(typeof(PartMetadataAttribute), false).FirstOrDefault() != null; if (isConfigured) { CompositionTrace.Registration_PartMetadataConventionOverridden(type); } else { foreach (Tuple <string, Func <Type, object> > item in _metadataItemFuncs) { var name = item.Item1; var value = (item.Item2 != null) ? item.Item2(type) : null; attributes.Add(new PartMetadataAttribute(name, value)); } } } if (_interfaceExports.Any()) { if (_typeExportBuilders != null) { bool isConfigured = type.GetCustomAttributes(typeof(ExportAttribute), false).FirstOrDefault() != null || MemberHasExportMetadata(type); if (isConfigured) { CompositionTrace.Registration_TypeExportConventionOverridden(type); } else { foreach (Type iface in type.GetInterfaces()) { Type underlyingType = iface.UnderlyingSystemType; if (underlyingType == typeof(IDisposable) || underlyingType == typeof(IPartImportsSatisfiedNotification)) { continue; } // Run through the export specifications see if any match foreach (Tuple <Predicate <Type>, Action <Type, ExportBuilder> > exportSpecification in _interfaceExports) { if (exportSpecification.Item1 != null && exportSpecification.Item1(underlyingType)) { ExportBuilder exportBuilder = new ExportBuilder(); exportBuilder.AsContractType((Type)iface); exportSpecification.Item2?.Invoke(iface, exportBuilder); exportBuilder.BuildAttributes(iface, ref attributes); } } } } } } return(attributes); }