mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
- 移除 .claude 设置文件 - 重构枚举扩展生成器文档,更新 API 使用方式和配置选项 - 调整日志生成器文档,更新属性使用方式和配置参数 - 修改 Git 忽略规则添加 .claude/settings.json - 更新代码示例和最佳实践指南
4.4 KiB
4.4 KiB
枚举扩展生成器
自动为枚举类型生成扩展方法
概述
枚举扩展生成器为标记了 [GenerateEnumExtensions] 属性的枚举自动生成两种扩展方法:
- IsX 方法:为每个枚举值生成判断方法
- 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. 命名约定
生成的方法名基于枚举值名称:
Normal→IsNormal()GameOver→IsGameOver()HTTP_ERROR→IsHTTP_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;
}
}
}
限制
- 只支持枚举类型:不能用于类或结构体
- 不支持 Flags 枚举的特殊处理:对于
[Flags]枚举,生成的方法仍然是简单的相等比较 - 不生成其他方法:只生成 IsX 和 IsIn 方法