public IExtensionMetadata GetExtensionMetadata([Required] string id) { IExtensionMetadata result = null; var type = GetType(); var fields = type.GetFields(BindingFlags.Instance | BindingFlags.NonPublic) .Where(x => x.GetCustomAttribute(typeof(ImportManyAttribute)) != null).ToArray(); if (fields.Any()) { foreach (var field in fields) { var variable = field.GetValue(this) as IEnumerable <object>; IExtensionMetadata metadata = variable? .Select(x => (IExtensionMetadata)x.GetType().GetProperty("Metadata")?.GetValue(x)) .FirstOrDefault(x => string.CompareOrdinal(x.Id, id) == 0); if (metadata != null) { result = metadata; break; } } } return(result); }
/// <summary> /// Tests a given extension metadata set against the given object. /// </summary> /// <param name="obj"></param> /// <param name="metadata"></param> /// <returns></returns> internal static bool Predicate(XObject obj, IExtensionMetadata metadata) { Contract.Requires <ArgumentNullException>(obj != null); Contract.Requires <ArgumentNullException>(metadata != null); if (!metadata.ObjectType.HasFlag(GetObjectType(obj))) { return(false); } if (obj is XElement) { if (!IsMatch((XElement)obj, metadata.NamespaceName, metadata.LocalName)) { return(false); } } if (obj is XAttribute) { if (!IsMatch((XAttribute)obj, metadata.NamespaceName, metadata.LocalName)) { return(false); } } // test against specified predicate type var predicate = metadata.PredicateType != null?predicates.GetOrAdd(metadata.PredicateType, _ => (IExtensionPredicate)Activator.CreateInstance(_)) : null; if (predicate != null) { if (!predicate.IsMatch(obj)) { return(false); } } return(true); }
/// <summary> /// Return the string used for the "scope". /// </summary> /// <param name="extensionMetadata_"></param> /// <returns>The scope, equal to assembly name, given by Assembly.GetName().Name</returns> public static string GetScope(this IExtensionMetadata extensionMetadata_) { return(extensionMetadata_.GetType().Assembly.GetName().Name); }
public void Construct(CompositionContainer container, IExtensionMetadata metadata) { if (Constructed) throw new ExtensionAlreadyContructedException(this); Metadata = metadata; container.SatisfyImportsOnce(this); ResolveBaseDependencies(); Construction(); Constructed = true; }
/// <summary> /// Tests a given extension metadata set against the given object. /// </summary> /// <param name="obj"></param> /// <param name="metadata"></param> /// <returns></returns> internal static bool Predicate(XObject obj, IExtensionMetadata metadata) { Contract.Requires<ArgumentNullException>(obj != null); Contract.Requires<ArgumentNullException>(metadata != null); if (!metadata.ObjectType.HasFlag(GetObjectType(obj))) return false; if (obj is XElement) if (!IsMatch((XElement)obj, metadata.NamespaceName, metadata.LocalName)) return false; if (obj is XAttribute) if (!IsMatch((XAttribute)obj, metadata.NamespaceName, metadata.LocalName)) return false; // test against specified predicate type var predicate = metadata.PredicateType != null ? predicates.GetOrAdd(metadata.PredicateType, _ => (IExtensionPredicate)Activator.CreateInstance(_)) : null; if (predicate != null) if (!predicate.IsMatch(obj)) return false; return true; }