private IEnumerable <ExportDefinition> GetExportDefinitions() { List <ExportDefinition> exports = new List <ExportDefinition>(); _contractNamesOnNonInterfaces = new HashSet <string>(); // GetExportMembers should only contain the type itself along with the members declared on it, // it should not contain any base types, members on base types or interfaces on the type. foreach (MemberInfo member in GetExportMembers(_type)) { foreach (ExportAttribute exportAttribute in member.GetAttributes <ExportAttribute>()) { AttributedExportDefinition attributedExportDefinition = CreateExportDefinition(member, exportAttribute); if (exportAttribute.GetType() == CompositionServices.InheritedExportAttributeType) { // Any InheritedExports on the type itself are contributed during this pass // and we need to do the book keeping for those. if (!_contractNamesOnNonInterfaces.Contains(attributedExportDefinition.ContractName)) { exports.Add(new ReflectionMemberExportDefinition(member.ToLazyMember(), attributedExportDefinition, this)); _contractNamesOnNonInterfaces.Add(attributedExportDefinition.ContractName); } } else { exports.Add(new ReflectionMemberExportDefinition(member.ToLazyMember(), attributedExportDefinition, this)); } } } // GetInheritedExports should only contain InheritedExports on base types or interfaces. // The order of types returned here is important because it is used as a // priority list of which InhertedExport to choose if multiple exists with // the same contract name. Therefore ensure that we always return the types // in the hierarchy from most derived to the lowest base type, followed // by all the interfaces that this type implements. foreach (Type type in GetInheritedExports(_type)) { foreach (InheritedExportAttribute exportAttribute in type.GetAttributes <InheritedExportAttribute>()) { AttributedExportDefinition attributedExportDefinition = CreateExportDefinition(type, exportAttribute); if (!_contractNamesOnNonInterfaces.Contains(attributedExportDefinition.ContractName)) { exports.Add(new ReflectionMemberExportDefinition(type.ToLazyMember(), attributedExportDefinition, this)); if (!type.IsInterface) { _contractNamesOnNonInterfaces.Add(attributedExportDefinition.ContractName); } } } } _contractNamesOnNonInterfaces = null; // No need to hold this state around any longer return(exports); }
private IEnumerable<ExportDefinition> GetExportDefinitions() { List<ExportDefinition> exports = new List<ExportDefinition>(); this._contractNamesOnNonInterfaces = new HashSet<string>(); // GetExportMembers should only contain the type itself along with the members declared on it, // it should not contain any base types, members on base types or interfaces on the type. foreach (MemberInfo member in GetExportMembers(this._type)) { foreach (ExportAttribute exportAttribute in member.GetAttributes<ExportAttribute>()) { var attributedExportDefinition = new AttributedExportDefinition(this, member, exportAttribute); if (exportAttribute.GetType() == CompositionServices.InheritedExportAttributeType) { // Any InheritedExports on the type itself are contributed during this pass // and we need to do the book keeping for those. if (!this._contractNamesOnNonInterfaces.Contains(attributedExportDefinition.ContractName)) { exports.Add(new ReflectionMemberExportDefinition(member.ToLazyMember(), attributedExportDefinition, this)); this._contractNamesOnNonInterfaces.Add(attributedExportDefinition.ContractName); } } else { exports.Add(new ReflectionMemberExportDefinition(member.ToLazyMember(), attributedExportDefinition, this)); } } } // GetInheritedExports should only contain InheritedExports on base types or interfaces. // The order of types returned here is important because it is used as a // priority list of which InhertedExport to choose if multiple exists with // the same contract name. Therefore ensure that we always return the types // in the hiearchy from most derived to the lowest base type, followed // by all the interfaces that this type implements. foreach (Type type in GetInheritedExports(this._type)) { foreach (InheritedExportAttribute exportAttribute in type.GetAttributes<InheritedExportAttribute>()) { var attributedExportDefinition = new AttributedExportDefinition(this, type, exportAttribute); if (!this._contractNamesOnNonInterfaces.Contains(attributedExportDefinition.ContractName)) { exports.Add(new ReflectionMemberExportDefinition(type.ToLazyMember(), attributedExportDefinition, this)); if (!type.IsInterface) { this._contractNamesOnNonInterfaces.Add(attributedExportDefinition.ContractName); } } } } this._contractNamesOnNonInterfaces = null; // No need to hold this state around any longer return exports; }