/// <summary> /// Examines the set of <paramref name="attributes"/> and returns a new <see cref="SourceInfo"/> /// instance from the first <c>SourceInfoAttribute</c> in the set. /// </summary> /// <param name="attributes">A list of attribute instances that may contain a <c>SourceInfoAttribute</c>.</param> /// <returns>A new <see cref="SourceInfo"/> instance or <c>null</c> if the set of <paramref name="attributes"/> /// did not contain a <c>SourceInfoAttribute</c>. /// </returns> internal static SourceInfo GetSourceInfoFromAttributes(IEnumerable <object> attributes) { SourceInfo sourceInfo = null; foreach (object attribute in attributes) { Type attributeType = attribute.GetType(); if (((SourceInfo.sourceInfoAttributeType != null && attributeType == SourceInfo.sourceInfoAttributeType)) || attributeType.FullName.EndsWith(SourceInfo.SourceInfoAttributeTypeName, StringComparison.Ordinal)) { return(SourceInfo.GetSourceInfoFromAttribute(attribute)); } } return(sourceInfo); }
/// <summary> /// See <see cref="ISourceFileProvider.GetFileForMember"/>. /// </summary> /// <remarks> /// This implementation-specific method uses Reflection to find a /// <c>SourceInfoAttribute</c> attached to the member. If present, /// it identifies the source file. /// </remarks> /// <param name="memberInfo">The member for which a file location is needed.</param> /// <returns>The file name or <c>null</c> if it cannot be determined.</returns> public string GetFileForMember(MemberInfo memberInfo) { SourceInfo sourceInfo = SourceInfo.GetSourceInfoFromAttributes(((ICustomAttributeProvider)memberInfo).GetCustomAttributes(false)); return((sourceInfo == null) ? null : sourceInfo.FileName); }