public static ReflectionComposablePart CreatePart(object attributedPart, ReflectionContext reflectionContext) { Assumes.NotNull(attributedPart); Assumes.NotNull(reflectionContext); // If given an instance then we want to pass the default composition options because we treat it as a shared part // TODO: ICompositionElement Give this def an origin indicating that it was added directly to the ComposablePartExportProvider. var mappedType = reflectionContext.MapType(IntrospectionExtensions.GetTypeInfo(attributedPart.GetType())); if (mappedType.Assembly.ReflectionOnly) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.Argument_ReflectionContextReturnsReflectionOnlyType, "reflectionContext"), "reflectionContext"); } ReflectionComposablePartDefinition definition = AttributedModelDiscovery.CreatePartDefinition(mappedType, PartCreationPolicyAttribute.Shared, true, (ICompositionElement)null); return CreatePart(definition, attributedPart); }
private void InitializeTypeCatalog(IEnumerable<Type> types, ReflectionContext reflectionContext) { var typesList = new List<Type>(); foreach(var type in types) { if (type == null) { throw ExceptionBuilder.CreateContainsNullElement("types"); } if (type.Assembly.ReflectionOnly) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.Argument_ElementReflectionOnlyType, "types"), "types"); } var typeInfo = type.GetTypeInfo(); var lclType = (reflectionContext != null) ? reflectionContext.MapType(typeInfo) : typeInfo; // It is valid for the reflectionContext to delete types by mapping them to null if(lclType != null) { // The final mapped type may be activated so we check to see if it is in a reflect only assembly if (lclType.Assembly.ReflectionOnly) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Strings.Argument_ReflectionContextReturnsReflectionOnlyType, "reflectionContext"), "reflectionContext"); } typesList.Add(lclType); } } this._types = typesList.ToArray(); }