/// <summary> /// Recupera os tipos que implementam os exports do tipo informado. /// </summary> /// <param name="type">Tipo que será analisado.</param> /// <param name="contractName"></param> /// <returns></returns> public IEnumerable <Type> GetExportTypes(Type type, string contractName) { IEnumerable <System.ComponentModel.Composition.Primitives.ExportDefinition> definitions = null; if (ExportProviderExtensions.TryGetExportDefintions(_exportProvider, type, contractName, out definitions)) { foreach (var definition in definitions) { var providerDefintion = definition as ProviderExportDefinition; if (providerDefintion != null) { var member = providerDefintion.Member; switch (member.MemberType) { case System.Reflection.MemberTypes.Field: yield return(((System.Reflection.FieldInfo)member).FieldType); break; case System.Reflection.MemberTypes.Method: yield return(((System.Reflection.MethodInfo)member).ReturnType); break; case System.Reflection.MemberTypes.Property: yield return(((System.Reflection.PropertyInfo)member).PropertyType); break; case System.Reflection.MemberTypes.Constructor: yield return(((System.Reflection.ConstructorInfo)member).DeclaringType); break; case System.Reflection.MemberTypes.NestedType: case System.Reflection.MemberTypes.TypeInfo: yield return((Type)member); break; } } } } }
/// <summary> /// Pré-configura os exports do tipo informado. /// </summary> /// <param name="type"></param> /// <param name="contractName"></param> /// <param name="result"></param> public void PreConfigure(Type type, string contractName, out PreConfigureResult result) { var notFoundTypes = new List <Type>(); var types = new List <Type>() { type }; for (var i = 0; i < types.Count; i++) { IEnumerable <System.ComponentModel.Composition.Primitives.ExportDefinition> definitions = null; if (ExportProviderExtensions.TryGetExportDefintions(_exportProvider, types[i], contractName, out definitions)) { foreach (var definition in definitions) { var providerDefintion = definition as ProviderExportDefinition; if (providerDefintion != null) { var member = providerDefintion.Member; if (member is System.Reflection.ConstructorInfo) { var ci = (System.Reflection.ConstructorInfo)member; foreach (var parameter in ci.GetParameters()) { if (!types.Contains(parameter.ParameterType)) { types.Add(parameter.ParameterType); } } } } } } else { notFoundTypes.Add(types[i]); } contractName = null; } result = new PreConfigureResult(notFoundTypes.Count == 0, notFoundTypes.ToArray()); }