You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在项目生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:05:39