考虑使用hasComment 添加,利用生成的xml文件信息
/// <summary>
/// xml注释获取器
/// </summary>
internal static class SummaryXmlCacheProvider
{
#region TClass
/// <summary>
/// 根据类型初始化该类所在程序集的xml
/// </summary>
/// <typeparam name="TClass"></typeparam>
internal static void InitSummaryXml<TClass>()
{
var assembly = Assembly.GetAssembly(typeof(TClass));
SerializeXmlFromAssembly(assembly);
}
/// <summary>
/// 根据类型获取该类所在程序集的xml
/// </summary>
/// <typeparam name="TClass"></typeparam>
/// <returns></returns>
internal static Dictionary<string, string> GetSummaryXml<TClass>()
{
var assembly = Assembly.GetAssembly(typeof(TClass));
return SummaryCache[assembly];
}
#endregion
/// <summary>
/// 根据程序集初始化xml
/// </summary>
/// <param name="assembly"></param>
private static void SerializeXmlFromAssembly(Assembly assembly)
{
var assemblyPath = assembly.Location;
var lastIndexOf = assemblyPath.LastIndexOf(".dll", StringComparison.Ordinal);
var xmlPath = assemblyPath.Remove(lastIndexOf, 4) + ".xml";
if (SummaryCache.ContainsKey(assembly))
return;
var xmlDic = new Dictionary<string, string>();
if (!File.Exists(xmlPath))
{
Console.WriteLine($"未能加载xml文件,原因:xml文件不存在,path:{xmlPath}");
SummaryCache.Add(assembly, xmlDic);
return;
}
var doc = new XmlDocument();
doc.Load(xmlPath);
var members = doc.SelectNodes("doc/members/member");
if (members == null)
{
Console.WriteLine($"未能加载xml文件,原因:doc/members/member节点不存在");
SummaryCache.Add(assembly, xmlDic);
return;
}
foreach (XmlElement member in members)
{
var name = member.Attributes["name"].InnerText.Trim();
if (string.IsNullOrWhiteSpace(name))
continue;
xmlDic.Add(name, member.SelectSingleNode("summary")?.InnerText.Trim());
}
SummaryCache.Add(assembly, xmlDic);
}
/// <summary>
/// xml注释缓存
/// </summary>
private static Dictionary<Assembly, Dictionary<string, string>> SummaryCache { get; } =
new Dictionary<Assembly, Dictionary<string, string>>();
}
此处我们项目中ef 导航属性,所以会有一些关联关系字段需要过滤掉,比较好的做法是使用attribute 标记出来,这样不用写死过滤
SummaryXmlCacheProvider.InitSummaryXml<TEntity>();
var sumDic = SummaryXmlCacheProvider.GetSummaryXml<TEntity>();
var type = typeof(TEntity);
var props = type.GetProperties();
sumDic = sumDic.Where(s => s.Key.Contains(type.FullName!) && !s.Key.EndsWith(type.FullName!)).ToDictionary(s => s.Key, s => s.Value);
if (sumDic.Any())
{
foreach (var kvp in sumDic)
{
var pName = kvp.Key.Split('.').Last();
var prop = props.FirstOrDefault(s => s.Name.Equals(pName));
if (prop != null && !prop.PropertyType.FullName!.Contains("iValon"))
{
builder.Property(pName)
.HasComment(kvp.Value);
}
}
}