Skip to content

枚举扩展生成器

GFramework.SourceGenerators 自动生成枚举扩展方法

概述

枚举扩展生成器为枚举类型自动生成常用的扩展方法,如获取描述、转换为字符串、解析等。这大大简化了枚举的操作。

基本用法

标记枚举

csharp
using GFramework.SourceGenerators.Attributes;

[EnumExtensions]
public enum PlayerState
{
    Idle,
    Running,
    Jumping,
    Attacking
}

生成的方法

上面的代码会被转换为:

csharp
public static class PlayerStateExtensions
{
    public static string GetDescription(this PlayerState value)
    {
        // 返回枚举的描述
    }

    public static bool HasFlag(this PlayerState value, PlayerState flag)
    {
        // 检查是否包含标志
    }

    public static PlayerState FromString(string value)
    {
        // 从字符串解析枚举
    }
}

常用方法

获取描述

csharp
[EnumExtensions]
public enum ItemQuality
{
    [Description("普通")]
    Common,
    
    [Description("稀有")]
    Rare,
    
    [Description("史诗")]
    Epic
}

public void PrintQuality(ItemQuality quality)
{
    // 获取描述文本
    Console.WriteLine(quality.GetDescription());
    // 输出: "普通" / "稀有" / "史诗"
}

安全解析

csharp
public void ParseState(string input)
{
    // 安全地解析字符串为枚举
    if (PlayerState.Running.TryParse(input, out var state))
    {
        Console.WriteLine($"状态: {state}");
    }
}

获取所有值

csharp
public void ListAllStates()
{
    // 获取所有枚举值
    foreach (var state in PlayerState.GetAllValues())
    {
        Console.WriteLine(state);
    }
}

标志枚举

对于使用 [Flags] 特性的枚举:

csharp
[EnumExtensions]
[Flags]
public enum PlayerPermissions
{
    None = 0,
    Read = 1,
    Write = 2,
    Execute = 4,
    All = Read | Write | Execute
}

public void CheckPermissions()
{
    var permissions = PlayerPermissions.Read | PlayerPermissions.Write;

    // 检查是否包含特定权限
    if (permissions.HasFlag(PlayerPermissions.Write))
    {
        Console.WriteLine("有写入权限");
    }

    // 获取所有设置的标志
    foreach (var flag in permissions.GetFlags())
    {
        Console.WriteLine($"权限: {flag}");
    }
}

自定义行为

忽略某些值

csharp
[EnumExtensions(IgnoreValues = new[] { ItemQuality.Undefined })]
public enum ItemQuality
{
    Undefined,
    Common,
    Rare,
    Epic
}

// GetAllValues() 不会返回 Undefined

自定义转换

csharp
[EnumExtensions(CaseSensitive = false)]
public enum Difficulty
{
    Easy,
    Medium,
    Hard
}

// FromString("EASY") 也能正确解析

相关文档

基于 Apache 2.0 许可证发布