如何在项目生成的XML文件中识别私有成员?
如何识别XML文档中的私有成员
针对你遇到的问题,分几种场景来说明识别方法:
1. XML里有明确注释说明的情况
就像你提供的示例一样,私有成员的<summary>里直接标注了私有属性,这种直接解析<summary>的文本内容就能快速识别。
2. 仅靠XML本身无法判断,需结合原程序集反射
标准的.NET XML文档注释不会在member的name属性里包含访问修饰符信息,而且默认编译时只会生成公共成员的注释,私有成员要出现在XML里,得在原项目编译时开启特殊配置(比如MSBuild里设置<IncludePrivateMembers>true</IncludePrivateMembers>)。
如果XML里已经包含了私有成员,但没有明确注释说明,就得结合原项目的程序集(比如TargetProject.dll)通过反射判断:
示例代码(C#)
using System; using System.Reflection; using System.Xml.Linq; using System.Linq; // 加载目标程序集 var targetAssembly = Assembly.LoadFrom("TargetProject.dll"); // 加载XML文档 var doc = XDocument.Load("TargetProject.xml"); foreach (var memberNode in doc.Descendants("member")) { var nameAttr = memberNode.Attribute("name"); if (nameAttr == null) continue; var nameParts = nameAttr.Value.Split(':'); if (nameParts.Length != 2) continue; var memberType = nameParts[0]; var fullName = nameParts[1]; // 以方法成员为例(标记为M:) if (memberType == "M") { // 拆分类型名和方法信息 var typeName = fullName.Substring(0, fullName.LastIndexOf('.')); var methodFull = fullName.Substring(fullName.LastIndexOf('.') + 1); var methodName = methodFull.Split('(')[0]; var paramTypeStr = methodFull.Split('(', ')')[1]; // 解析参数类型 Type[] paramTypes = string.IsNullOrEmpty(paramTypeStr) ? Array.Empty<Type>() : paramTypeStr.Split(',') .Select(t => Type.GetType(t.Trim(), true, true)) .ToArray(); // 获取目标类型 var targetType = targetAssembly.GetType(typeName); if (targetType == null) continue; // 查找方法(包括私有方法) var method = targetType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, paramTypes); if (method != null) { bool isPrivate = method.IsPrivate; Console.WriteLine($"成员 {fullName} 是否为私有:{isPrivate}"); } } // 字段(F:)、属性(P:)等成员类型可以用类似逻辑处理 }
3. 自定义生成XML时提前加入标识
如果是你自己写工具提取的XML,可以在生成阶段就给<member>节点加上access属性,比如:
<member name="M:TargetProject.Target.TargetClass.Function2(System.String,System.Int32)" access="private"> <summary>This is Private Member Function</summary> </member>
这样解析时直接读取access属性就能判断,不用依赖程序集。
内容的提问来源于stack exchange,提问作者Spiegel
相关产品推荐
相关产品推荐

