GeWuYou 740cc66ac4 docs: 更新源生成器文档并调整配置
- 移除 .claude 设置文件
- 重构枚举扩展生成器文档,更新 API 使用方式和配置选项
- 调整日志生成器文档,更新属性使用方式和配置参数
- 修改 Git 忽略规则添加 .claude/settings.json
- 更新代码示例和最佳实践指南
2026-03-07 23:13:21 +08:00

4.4 KiB
Raw Blame History

枚举扩展生成器

自动为枚举类型生成扩展方法

概述

枚举扩展生成器为标记了 [GenerateEnumExtensions] 属性的枚举自动生成两种扩展方法:

  1. IsX 方法:为每个枚举值生成判断方法
  2. IsIn 方法:判断枚举值是否在指定集合中

基础使用

using GFramework.SourceGenerators.Abstractions.enums;

[GenerateEnumExtensions]
public enum GameState
{
    Normal,
    Paused,
    GameOver
}

生成的代码

编译器会自动生成如下扩展方法:

// <auto-generated/>
public static class GameStateExtensions
{
    // 为每个枚举值生成 IsX 方法
    public static bool IsNormal(this GameState value)
        => value == GameState.Normal;

    public static bool IsPaused(this GameState value)
        => value == GameState.Paused;

    public static bool IsGameOver(this GameState value)
        => value == GameState.GameOver;

    // 生成 IsIn 方法
    public static bool IsIn(this GameState value, params GameState[] values)
    {
        if (values == null) return false;
        foreach (var v in values) if (value == v) return true;
        return false;
    }
}

使用示例

var state = GameState.Paused;

// 使用 IsX 方法
if (state.IsPaused())
{
    Console.WriteLine("游戏已暂停");
}

// 使用 IsIn 方法
if (state.IsIn(GameState.Paused, GameState.GameOver))
{
    Console.WriteLine("游戏未在运行中");
}

配置选项

可以通过属性参数控制生成行为:

[GenerateEnumExtensions(
    GenerateIsMethods = true,      // 是否生成 IsX 方法(默认 true
    GenerateIsInMethod = true      // 是否生成 IsIn 方法(默认 true
)]
public enum GameState
{
    Normal,
    Paused,
    GameOver
}

只生成 IsX 方法

[GenerateEnumExtensions(GenerateIsInMethod = false)]
public enum GameState
{
    Normal,
    Paused
}

// 只生成 IsNormal() 和 IsPaused(),不生成 IsIn()

只生成 IsIn 方法

[GenerateEnumExtensions(GenerateIsMethods = false)]
public enum GameState
{
    Normal,
    Paused
}

// 只生成 IsIn(),不生成 IsNormal() 和 IsPaused()

最佳实践

1. 命名约定

生成的方法名基于枚举值名称:

  • NormalIsNormal()
  • GameOverIsGameOver()
  • HTTP_ERRORIsHTTP_ERROR()

2. 性能考虑

生成的方法是内联的,性能与手写代码相同:

// 生成的代码
public static bool IsNormal(this GameState value)
    => value == GameState.Normal;

// 等价于手写
if (state == GameState.Normal) { }

3. 可读性提升

// 使用生成的方法(推荐)
if (state.IsPaused())
{
    ResumeGame();
}

// 直接比较(不推荐)
if (state == GameState.Paused)
{
    ResumeGame();
}

实际应用示例

游戏状态管理

[GenerateEnumExtensions]
public enum GameState
{
    MainMenu,
    Playing,
    Paused,
    GameOver,
    Victory
}

public class GameManager
{
    private GameState _currentState = GameState.MainMenu;

    public bool CanProcessInput()
    {
        // 使用 IsIn 方法简化多值判断
        return _currentState.IsIn(GameState.Playing, GameState.MainMenu);
    }

    public void Update()
    {
        // 使用 IsX 方法提高可读性
        if (_currentState.IsPlaying())
        {
            UpdateGameLogic();
        }
        else if (_currentState.IsPaused())
        {
            UpdatePauseMenu();
        }
    }
}

角色状态控制

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

public class PlayerController
{
    private PlayerState _state = PlayerState.Idle;

    public bool CanAttack()
    {
        // 清晰表达可以攻击的状态
        return _state.IsIn(PlayerState.Idle, PlayerState.Walking, PlayerState.Running);
    }

    public void HandleInput(string action)
    {
        if (action == "jump" && !_state.IsJumping())
        {
            _state = PlayerState.Jumping;
        }
    }
}

限制

  1. 只支持枚举类型:不能用于类或结构体
  2. 不支持 Flags 枚举的特殊处理:对于 [Flags] 枚举,生成的方法仍然是简单的相等比较
  3. 不生成其他方法:只生成 IsX 和 IsIn 方法

相关文档