Baike.dev
All toolsOnline toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
P

PlantUmlClassDiagramGenerator

> 编程语言
Open source

This is a generator to create a class-diagram of PlantUML from the C# source code.

772 stars0 likes1 views
WebsiteGitHub

About

This is a generator to create a class-diagram of PlantUML from the C# source code.

PlantUmlClassDiagramGenerator

This is a generator to create a class-diagram of PlantUML from the C# source code.

README.md Version revision history

Version Commit Comment
1.2 df40b74 Add "-addPackageTags" option
1.1 e73b4fe Add "-excludeUmlBeginEndTags" option
1.0 70bb820 Because the README.md for other languages is not always updated at the same time, a version number is needed

Roslyn Source Generator

The class diagram is automatically generated by the Roslyn Source Generator. Details are provided in the link below.

  • PlantUmlClassDiagramGenerator.SourceGenerator

Visual Studio Code Extension

  • C# to PlantUML

.Net Core global tools

Nuget Gallery: https://www.nuget.org/packages/PlantUmlClassDiagramGenerator

Installation

Download and install the .NET 8.0 SDK or newer. Once installed, run the following command.

bat
dotnet tool install --global PlantUmlClassDiagramGenerator

Usage

Run the "puml-gen" command.

bat
puml-gen InputPath [OutputPath] [-dir] [-addPackageTags] [-public | -ignore IgnoreAccessibilities] [-excludePaths ExcludePathList] [-createAssociation]
  • InputPath: (Required) Sets a input source file or directory name.
  • OutputPath: (Optional) Sets a output file or directory name.
    If you omit this option, plantuml files are outputted to same directory as the input files.
  • -dir: (Optional) Specify when InputPath and OutputPath are directory names.
  • -addPackageTags: (Optional) If there is "-dir" tag, then program adds "package" tags and puts all relations in the end of include.puml
  • -public: (Optional) If specified, only public accessibility members are output.
  • -ignore: (Optional) Specify the accessibility of members to ignore, with a comma separated list.
  • -excludePaths: (Optional) Specify the exclude file and directory.
    Specifies a relative path from the "InputPath", with a comma separated list. To exclude multiple paths, which contain a specific folder name, preceed the name by "**/". Example: "**/bin"
  • -createAssociation: (Optional) Create object associations from references of fields and properites.
  • -allInOne: (Optional) Only if -dir is set: copy the output of all diagrams to file include.puml (this allows a PlanUMLServer to render it).
  • -attributeRequired: (Optional) When this switch is enabled, only types with "PlantUmlDiagramAttribute" in the type declaration will be output.
  • -excludeUmlBeginEndTags: (Optional) When this switch is enabled, it will exclude the "@startuml" and "@enduml" tags from the puml file.

examples

bat
puml-gen C:\Source\App1\ClassA.cs -public
bat
puml-gen C:\Source\App1 C:\PlantUml\App1 -dir -ignore Private,Protected -createAssociation -allInOne
bat
puml-gen C:\Source\App1 C:\PlantUml\App1 -dir -excludePaths bin,obj,Properties

Specification for conversion to PlantUML

Type Declaration

Type Keywords

C# PlantUML
class class
struct struct
interface interface
enum enum
record > class

Type Modifiers

C# PlantUML
abstract abstract
static >
partial <>
sealed >
  • C#
cs
class ClassA {  
}
struct StructA {
}
interface InterfaceA {
}
record RecordA {
}
abstract class AbstractClass {
}
static class StaticClass {
}
sealed partial class ClassB{
}
enum EnumType{
  Apple,
  Orange,
  Grape
}
  • PlantUML
@startuml
class ClassA {
}
struct StructA {
}
interface InterfaceA {
}
class RecordA > {
}
abstract class AbstractClass {
}
class StaticClass > {
}
class ClassB > <> {
}
enum EnumType {
    Apple,
    Orange,
    Grape,
}
@enduml

Generics Type

  • C#
cs
class GenericsType{
}
class GenericsType{
}
  • PlantUML
class "GenericsType`1"{
}
class "GenericsType`2"{
}

Member Declaration

Accessibility Modifiers

C# PlantUML
public +
internal <>
protected internal # <>
protected #
private -

Modifiers

C# PlantUML
abstract {abstract}
static {static}
virtual >
override >
new >
readonly >
event >

Property Accessors

C# PlantUML
int Prop {get; set;} Prop : int > >
int Prop {get;} Prop : int
int Prop {get; private set } Prop : int ><>
int Prop => 100; Prop : int >
  • C#
…
  • PlantUML
abstract class AbstractClass {
    # _x : int
    <> _y : int
    # <> _z : int
    + {abstract} AbstractMethod() : void
    # > VirtualMethod(s:string) : void
    + BaseMethod(n:int) : string
}
class ClassM {
    + {static} > PI : double = 3.141592
    + PropA : int > >
    + PropB : int > <>
    +  > SomeEvent : EventHandler 
    + > AbstractMethod() : void
    # > VirtualMethod(s:string) : void
    + > ToString() : string
    + > BaseMethod(n:int) : string
}
AbstractClass  Items = new List(); 
}
  • PlantUML
class ClassC {
  - fieldA : int = 123
  + Pi : double = 3.14159
  # Items : List
}

Nested Class Declaration

Nested classes are expanded and associated with "OuterClass + - InnerClass".

  • C#
cs
class OuterClass 
{
  class InnerClass 
  {
    struct InnerStruct 
    {

    }
  }
}
  • PlantUML
class OuterClass{

}
class InnerClass{

}
> class InnerStruct {

}
OuterClass +- InnerClass
InnerClass +- InnerStruct

Inheritance Relationsips

  • C#
cs
abstract class BaseClass
{
    public abstract void AbstractMethod();
    protected virtual int VirtualMethod(string s) => 0;
}
class SubClass : BaseClass
{
    public override void AbstractMethod() { }
    protected override int VirtualMethod(string s) => 1;
}

interface IInterfaceA {}
interface IInterfaceA:IInterfaceA
{
    T Value { get; }
}
class ImplementClass : IInterfaceA
{
    public int Value { get; }
}
  • PlantUML
abstract class BaseClass {
    + {abstract} AbstractMethod() : void
    # > VirtualMethod(s:string) : int
}
class SubClass {
    + > AbstractMethod() : void
    # > VirtualMethod(s:string) : int
}
interface IInterfaceA {
}
interface "IInterfaceA`1" {
    Value : T >
}
class ImplementClass {
    + Value : int >
}
BaseClass  Strings{get;} = new List();
    public Type1 Prop1{get;set;}
    public Type2 field1;
}

class Type1 {
    public int value1{get;set;}
}

class Type2{
    public string string1{get;set;}
    public ExternalType Prop2 {get;set;}
}
  • PlantUML
@startuml
class ClassA {
}
class Type1 {
    + value1 : int > >
}
class Type2 {
    + string1 : string > >
}
class "IList`1" {
}
ClassA o-> "Strings" "IList`1"
ClassA --> "Prop1" Type1
ClassA --> "field1" Type2
Type2 --> "Prop2" ExternalType
@enduml

Record types (with parameter list)

Record types in C# 9 can have a parameter list. In these cases these parameters are added as properties to the class.

  • C#
cs
record Person(string Name, int Age);

record Group(string GroupName) {
    public Person[] Members { get; init; }
}
  • PlantUML
@startuml
class Person > {
    + Name : string > <>
    + Age : int > <>
}
class Group > {
    + GroupName : string > <>
    + Members : Person[] > <>
}
@enduml

Attribute-based configuration

You can add the package PlantUmlClassDiagramGenerator.Attributes to your C# project for attribute-based configuration.

PlantUmlDiagramAttribute

Only types to which PlantUmlDiagramAttribute has been added will be output. This attribute is enabled if the -attributeRequired switch is added to the command line argument.

This attribute can be added only to type declalerations.

  • class
  • struct
  • enum
  • record
cs
class ClassA
{
    public string Name { get; set; }
    public int Age { get; set; }
}

[PlantUmlDiagram]
class ClassB
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Only ClassB with PlantUmlDiagramAttribute will be output.

@startuml
class ClassB {
    + Name : string > >
    + Age : int > >
}
@enduml

PlantUmlIgnoreAttribute

Elements with this attribute added are excluded from the output.

cs
[PlantUmlIgnore]
class ClassA
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class ClassB
{
    public string Name { get; set; }
    [PlantUmlIgnore]
    public int Age { get; set; }
}

class ClassC
{
    public string Name { get; set; }
    public int Age { get; set; }

    [PlantUmlIgnore]
    public ClassC(string name, int age) => (Name, Age) = (name, age);
    
    public void MethodA();
    
    [PlantUmlIgnore]
    public void MethodB();
}
@startuml
class ClassB {
    + Name : string
}
class ClassC {
    + Name : string
    + Age : int
    + MethodA() : void
}
@enduml

PlantUmlAssociationAttribute

By adding this attribute, you can define association between classes. This attribute can be added to properties, fields and method parameters.

The details of the association are defined in the following properties.

  • Name
    • Specifies the type name on the leaf node side.
    • If omitted, the name of the element to which the attribute is added is used.
  • Association
    • Specifies the edge portion of the association.Sets a valid string in PlantUML.
    • If omitted, "--" is used.
  • RootLabel
    • Specifies the label to be displayed on the root node side.
    • If omitted, nothing is displayed.
  • Label
    • Specifies the label to be displayed in the center of the edge.
    • If omitted, nothing is displayed.
  • LeafLabel
    • Specifies the label to be displayed on the leaf node side.
    • If omitted, nothing is displayed.
…
@startuml
class Parameters {
    + A : string > >
    + B : string > >
}
class CustomAssociationSample {
}
class CollectionItemsSample {
}
class MethodParamtersSample {
    + Run(p:Parameters) : void
    + MyClass(logger:ILogger)
}
CustomAssociationSample "RootLabel" *--> "LeafLabel" Name : "Label"
CollectionItemsSample o-- "0..*" Item : "Items"
MethodParamtersSample ..> Parameters : "use"
MethodParamtersSample ..> ILogger : "Injection"
@enduml

PlantUmlIgnoreAssociationAttribute

This attribute can be added to properties and fields. Propertie

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

C#c-sharpclass-diagramplantuml

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言