mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-23 03:04:29 +08:00
- 将所有小写的命名空间导入更正为首字母大写格式 - 统一 GFramework 框架的命名空间引用规范 - 修复 core、ecs、godot 等模块的命名空间导入错误 - 标准化文档示例代码中的 using 语句格式 - 确保所有文档中的命名空间引用保持一致性 - 更新 global using 语句以匹配正确的命名空间格式
237 lines
4.4 KiB
Markdown
237 lines
4.4 KiB
Markdown
# 枚举扩展生成器
|
||
|
||
> 自动为枚举类型生成扩展方法
|
||
|
||
## 概述
|
||
|
||
枚举扩展生成器为标记了 `[GenerateEnumExtensions]` 属性的枚举自动生成两种扩展方法:
|
||
|
||
1. **IsX 方法**:为每个枚举值生成判断方法
|
||
2. **IsIn 方法**:判断枚举值是否在指定集合中
|
||
|
||
## 基础使用
|
||
|
||
```csharp
|
||
using GFramework.SourceGenerators.Abstractions.Enums;
|
||
|
||
[GenerateEnumExtensions]
|
||
public enum GameState
|
||
{
|
||
Normal,
|
||
Paused,
|
||
GameOver
|
||
}
|
||
```
|
||
|
||
## 生成的代码
|
||
|
||
编译器会自动生成如下扩展方法:
|
||
|
||
```csharp
|
||
// <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;
|
||
}
|
||
}
|
||
```
|
||
|
||
## 使用示例
|
||
|
||
```csharp
|
||
var state = GameState.Paused;
|
||
|
||
// 使用 IsX 方法
|
||
if (state.IsPaused())
|
||
{
|
||
Console.WriteLine("游戏已暂停");
|
||
}
|
||
|
||
// 使用 IsIn 方法
|
||
if (state.IsIn(GameState.Paused, GameState.GameOver))
|
||
{
|
||
Console.WriteLine("游戏未在运行中");
|
||
}
|
||
```
|
||
|
||
## 配置选项
|
||
|
||
可以通过属性参数控制生成行为:
|
||
|
||
```csharp
|
||
[GenerateEnumExtensions(
|
||
GenerateIsMethods = true, // 是否生成 IsX 方法(默认 true)
|
||
GenerateIsInMethod = true // 是否生成 IsIn 方法(默认 true)
|
||
)]
|
||
public enum GameState
|
||
{
|
||
Normal,
|
||
Paused,
|
||
GameOver
|
||
}
|
||
```
|
||
|
||
### 只生成 IsX 方法
|
||
|
||
```csharp
|
||
[GenerateEnumExtensions(GenerateIsInMethod = false)]
|
||
public enum GameState
|
||
{
|
||
Normal,
|
||
Paused
|
||
}
|
||
|
||
// 只生成 IsNormal() 和 IsPaused(),不生成 IsIn()
|
||
```
|
||
|
||
### 只生成 IsIn 方法
|
||
|
||
```csharp
|
||
[GenerateEnumExtensions(GenerateIsMethods = false)]
|
||
public enum GameState
|
||
{
|
||
Normal,
|
||
Paused
|
||
}
|
||
|
||
// 只生成 IsIn(),不生成 IsNormal() 和 IsPaused()
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
### 1. 命名约定
|
||
|
||
生成的方法名基于枚举值名称:
|
||
|
||
- `Normal` → `IsNormal()`
|
||
- `GameOver` → `IsGameOver()`
|
||
- `HTTP_ERROR` → `IsHTTP_ERROR()`
|
||
|
||
### 2. 性能考虑
|
||
|
||
生成的方法是内联的,性能与手写代码相同:
|
||
```csharp
|
||
// 生成的代码
|
||
public static bool IsNormal(this GameState value)
|
||
=> value == GameState.Normal;
|
||
|
||
// 等价于手写
|
||
if (state == GameState.Normal) { }
|
||
```
|
||
|
||
### 3. 可读性提升
|
||
|
||
```csharp
|
||
// 使用生成的方法(推荐)
|
||
if (state.IsPaused())
|
||
{
|
||
ResumeGame();
|
||
}
|
||
|
||
// 直接比较(不推荐)
|
||
if (state == GameState.Paused)
|
||
{
|
||
ResumeGame();
|
||
}
|
||
```
|
||
|
||
## 实际应用示例
|
||
|
||
### 游戏状态管理
|
||
|
||
```csharp
|
||
[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();
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 角色状态控制
|
||
|
||
```csharp
|
||
[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 方法
|
||
|
||
## 相关文档
|
||
|
||
- [Source Generators 概述](./index)
|
||
- [日志生成器](./logging-generator)
|
||
- [ContextAware 生成器](./context-aware-generator)
|