【问题标题】:Programmatically generating C# Code Documentation (summary) with CodeDOM使用 CodeDOM 以编程方式生成 C# 代码文档(摘要)
【发布时间】:2014-04-29 14:07:34
【问题描述】:

我想用 CodeDOM 生成 C# 代码文档。

没有文档的代码:

public class MyType {                 
    public static BitmapImage File {
        get { return GetFile("..."); }
    }
}

带有文档的代码:

/// <summary> Gets the File from the location </summary>
public class MyType {                 
    public static BitmapImage File {
        get { return GetFile("..."); }
    }
}

/// <summary>
/// Gets the File from the location 
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public class MyType {                 
    public static BitmapImage File {
        get { return GetFile("..."); }
    }
}

我能够生成 Class、Member,我可以添加一些属性和装饰器,但是如何生成文档 - 不幸的是没有。

我如何生成成员:

private CodeTypeDeclaration CreateType() {
    var classType = new CodeTypeDeclaration("MyType") {
        Attributes = MemberAttributes.Public | MemberAttributes.Static
    };

    var properties = CreateMembers();
    classType.Members.AddRange(properties);

    return classType;
}

private CodeTypeMember[] CreateMembers() {
    var members = _members.Where(x => IsMy(x.Name));
    var props = members.Select(CreateProperty).ToArray();
    return props;
}

private CodeTypeMember CreateProperty(X x) {
    var name = Path.GetFileNameWithoutExtension(x.Name);     

    var property = new CodeMemberProperty {
        Name = name,
        HasGet = true,
        Attributes = MemberAttributes.Public | MemberAttributes.Static,
        Type = new CodeTypeReference(typeof(BitmapImage)),
    };

    var targetObject = new CodeTypeReferenceExpression(typeof(Y));
    var method = Return(new CodeMethodInvokeExpression(targetObject, "Getx", Primitive(x.Name)));
    property.GetStatements.Add(method);
    return property;
}

private bool IsMy(string path) {
    var extension = Path.GetExtension(path.ToLower());
    var isMy = Regex.IsMatch(extension, @"\.(jpg)$");
    return isMy;
}

编辑:
添加实现:

private CodeTypeMember CreateProperty(X x) {
    var name = Path.GetFileNameWithoutExtension(x.Name);     

    var property = new CodeMemberProperty {
        Name = name,
        HasGet = true,
        Attributes = MemberAttributes.Public | MemberAttributes.Static,
        Type = new CodeTypeReference(typeof(BitmapImage)),
    };

    var targetObject = new CodeTypeReferenceExpression(typeof(Y));
    var method = Return(new CodeMethodInvokeExpression(targetObject, "Getx", Primitive(x.Name)));
    property.GetStatements.Add(method);

   //because CodeMemberProperty.Comments is readonly I cast it to CodeTypeMember, which has read/write Comments

    var docStart = new CodeCommentStatement("<summary>", true);
    var fileSystemName = string.Format("File system Name: {0}", x.Name);
    var docContent = new CodeCommentStatement(fileSystemName, true);
    var docEnd = new CodeCommentStatement("</summary>", true);

    var result = property as CodeTypeMember;
    result.Comments.AddRange(new CodeCommentStatementCollection {
        docStart,
        docContent,
        docEnd
    });
    return result;
}

【问题讨论】:

    标签: c# documentation code-generation codedom


    【解决方案1】:
    CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
    class1.Comments.Add(new CodeCommentStatement("<summary>", true));
    class1.Comments.Add(new CodeCommentStatement("Create a Hello World application.", true));
    class1.Comments.Add(new CodeCommentStatement("</summary>", true));
    

    How to: Create an XML Documentation File Using CodeDOM

    【讨论】:

    • mm,这仅适用于CodeTypeDeclaration(类),但不适用于CodeMemberProperty(属性/方法)... :(
    • 可以使用 CodeTypeMember.Comments 属性吗? link
    • 谢谢。根据您的想法,我找到了以下解决方案:将CodeMemberProperty 转换为它的基础CodeTypeMember。向这个基础CodeTypeMember 添加评论并使用它:)
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多