mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 18:52:08 +08:00
创建了 GFramework.Game 模块的详细 README 文档,涵盖以下核心内容: - 模块概述和核心设计理念介绍 - 架构模块系统说明,包含 AbstractModule 使用示例 - 资产管理系统详解,包括资产目录和映射功能 - 存储系统实现,支持分层存储和缓存机制 - 序列化系统集成,基于 Newtonsoft.Json 的完整方案 - 丰富的代码示例,展示实际使用场景 - 最佳实践指南,涵盖数据模型设计和性能优化建议 - 性能特性说明和技术栈依赖关系
18 KiB
18 KiB
GFramework.SourceGenerators API 参考
GFramework.SourceGenerators 模块的完整 API 参考文档,包含所有源代码生成器的详细说明。
📋 目录
日志生成器
[Log] 属性
为标记的类自动生成 ILogger 字段。
构造函数参数
[Log(
string fieldName = "Logger", // 生成的字段名
AccessModifier accessModifier = AccessModifier.Private, // 访问修饰符
bool isStatic = true, // 是否生成静态字段
string loggerName = null, // 自定义日志器名称
LogLevel minLevel = LogLevel.None, // 最小日志级别
bool includeLoggerInterface = false // 是否包含 ILogger 接口
bool enableConditionalCompilation = false // 是否启用条件编译
string loggerInterfaceName = "ILogger" // 日志接口名称
bool suppressAutoGeneratedAttribute = false // 是否抑制自动生成属性
string category = null // 日志类别
bool forceContextualLogging = false // 是否强制上下文日志
bool enableStructuredLogging = false // 是否启用结构化日志
string loggerFactoryName = null // 日志工厂名称
string logMessagePrefix = null // 日志消息前缀
bool enablePerformanceLogging = false // 是否启用性能日志
bool enableAsyncLogging = false // 是否启用异步日志
bool enableFluentLogging = false // 是否启用流畅日志
bool enableScopedLogging = false // 是否启用作用域日志
)]
生成的代码示例
// 默认配置生成的代码
public partial class MyClass
{
private static readonly ILogger Logger =
LoggerFactory.Create(builder => builder
.AddConsole()
.SetMinimumLevel(LogLevel.Information)
.CreateLogger<MyClass>());
}
// 自定义配置生成的代码
[Log(
fieldName = "CustomLogger",
accessModifier = AccessModifier.Public,
isStatic = false,
loggerName = "Custom.MyClass",
minLevel = LogLevel.Debug,
includeLoggerInterface = true
)]
public partial class CustomClass : ILogger
{
public ILogger CustomLogger { get; }
static CustomClass()
{
CustomLogger = LoggerFactory.Create(builder => builder
.AddConsole()
.SetMinimumLevel(LogLevel.Debug)
.CreateLogger<CustomClass>());
}
}
支持的方法
生成的 Logger 支持以下方法:
// 基础日志方法
Logger.LogDebug("Debug message");
Logger.LogInformation("Info message");
Logger.LogWarning("Warning message");
Logger.LogError("Error message");
Logger.LogCritical("Critical message");
// 带格式化的日志方法
Logger.LogInformation("Player {Name} has {Health} health", playerName, playerHealth);
// 异步日志方法
await Logger.LogInformationAsync("Async message");
// 结构化日志
Logger.LogInformation(new { PlayerName = "John", Health = 100 }, "Player {Name} has {Health} health");
上下文感知生成器
[ContextAware] 属性
为标记的类自动实现 IContextAware 接口。
生成的代码示例
[ContextAware]
public partial class MyClass : IContextAware
{
private IContextAware.Context _context;
public IContextAware.Context Context => _context ??= new LazyContext(this);
public void SetContext(IContextAware.Context context)
{
_context = context;
}
public IContextAware.Context GetContext()
{
return _context;
}
}
// 使用延迟初始化
[ContextAware(useLazy = true)]
public partial class LazyContextClass : IContextAware
{
private Lazy<IContextAware.Context> _context;
public IContextAware.Context Context => _context.Value;
public void SetContext(IContextAware.Context context)
{
_context = new Lazy<IContextAware.Context>(() => context);
}
}
// 带上下文验证
[ContextAware(validateContext = true)]
public partial class ValidatedContextClass : IContextAware
{
private IContextAware.Context _context;
public IContextAware.Context Context =>
{
get => _context;
private set
{
_context = value;
if (_context?.IsInvalid == true)
{
throw new InvalidOperationException("Context is invalid");
}
}
}
}
可用的方法
// 获取模型
var playerModel = Context.GetModel<PlayerModel>();
var gameModel = Context.GetModel<GameModel>();
// 获取系统
var combatSystem = Context.GetSystem<CombatSystem>();
var audioSystem = Context.GetSystem<AudioSystem>();
// 获取工具
var storageUtility = Context.GetUtility<StorageUtility>();
var mathUtility = Context.GetUtility<MathUtility>();
// 发送事件
Context.SendEvent<PlayerDiedEvent>();
Context.SendEvent<DamageDealtEvent>(new DamageDealtEvent { Damage = 50 });
// 发送命令
Context.SendCommand(new AttackCommand());
var result = Context.SendCommand<AttackResult>(new AttackCommand());
// 发送查询
var canAttack = Context.SendQuery<CanAttackQuery>();
var playerData = Context.SendQuery<GetPlayerDataQuery>();
枚举扩展生成器
[GenerateEnumExtensions] 属性
为枚举类型自动生成扩展方法。
构造函数参数
[GenerateEnumExtensions(
bool generateIsMethods = true, // 是否生成 IsX() 方法
bool generateHasMethod = true, // 是否生成 HasX() 方法
bool generateInMethod = true, // 是否生成 In(params T[]) 方法
bool generateTryParseMethod = false, // 是否生成 TryParse() 方法
string customPrefix = "Is", // 自定义方法名前缀
bool includeToString = false, // 是否生成 ToString 扩展
bool generateAllMethod = false, // 是否生成 All() 方法
bool generateCountMethod = false, // 是否生成 Count() 方法
bool generateDescriptionMethod = false, // 是否生成 Description() 方法
bool generateValuesMethod = false, // 是否生成 Values() 方法
string customNamespace = null, // 自定义命名空间
bool generateExtensionMethods = true, // 是否生成扩展方法
bool generateFlagMethods = true, // 是否为位标志枚举生成方法
bool generateValidationMethods = false, // 是否生成验证方法
bool generateUtilityMethods = false, // 是否生成工具方法
bool generateQueryableMethods = false, // 是否生成查询方法
string customMethodNameFormat = null, // 自定义方法名格式
bool generateDocumentation = false, // 是否生成文档注释
bool generateExamples = false, // 是否生成使用示例
)]
普通枚举生成的代码示例
[GenerateEnumExtensions]
public enum PlayerState
{
Idle,
Walking,
Running,
Jumping,
Attacking
}
// 生成的扩展方法
public static class PlayerStateExtensions
{
public static bool IsIdle(this PlayerState state) => state == PlayerState.Idle;
public static bool IsWalking(this PlayerState state) => state == PlayerState.Walking;
public static bool IsRunning(this PlayerState state) => state == PlayerState.Running;
public static bool IsJumping(this PlayerState state) => state == PlayerState.Jumping;
public static bool IsAttacking(this PlayerState state) => state == PlayerState.Attacking;
public static bool In(this PlayerState state, params PlayerState[] values)
{
return values.Contains(state);
}
}
位标志枚举生成的代码示例
[GenerateEnumExtensions]
[Flags]
public enum PlayerPermissions
{
None = 0,
CanMove = 1 << 0,
CanAttack = 1 << 1,
CanUseItems = 1 << 2,
CanChat = 1 << 3,
CanTrade = 1 << 4
}
// 生成的扩展方法
public static class PlayerPermissionsExtensions
{
public static bool HasCanMove(this PlayerPermissions permissions) => permissions.HasFlag(PlayerPermissions.CanMove);
public static bool HasCanAttack(this PlayerPermissions permissions) => permissions.HasFlag(PlayerPermissions.CanAttack);
public static bool HasCanUseItems(this PlayerPermissions permissions) => permissions.HasFlag(PlayerPermissions.CanUseItems);
public static bool HasAny(this PlayerPermissions permissions, params PlayerPermissions[] flags)
{
return flags.Any(flag => permissions.HasFlag(flag));
}
public static bool HasAll(this PlayerPermissions permissions, params PlayerPermissions[] flags)
{
return flags.All(flag => permissions.HasFlag(flag));
}
public static PlayerPermissions Add(this PlayerPermissions permissions, PlayerPermissions other)
{
return permissions | other;
}
public static PlayerPermissions Remove(this PlayerPermissions permissions, PlayerPermissions other)
{
return permissions & ~other;
}
public static PlayerPermissions Toggle(this PlayerPermissions permissions, PlayerPermissions flag)
{
return permissions ^ flag;
}
}
高级功能示例
[GenerateEnumExtensions(
customPrefix = "Is",
includeToString = true,
generateDescriptionMethod = true,
generateUtilityMethods = true
)]
public enum GameState
{
[Description("游戏菜单状态")]
Menu,
[Description("游戏进行中")]
Playing,
[Description("游戏暂停")]
Paused,
[Description("游戏结束")]
GameOver
}
// 生成的扩展方法包含更多功能
public static class GameStateExtensions
{
// IsX() 方法
public static bool IsMenu(this GameState state) => state == GameState.Menu;
public static bool IsPlaying(this GameState state) => state == GameState.Playing;
public static bool IsPaused(this GameState state) => state == GameState.Paused;
public static bool IsGameOver(this GameState state) => state == GameState.GameOver;
// ToString() 扩展
public static string ToDisplayString(this GameState state)
{
return state switch
{
GameState.Menu => "游戏菜单",
GameState.Playing => "游戏进行中",
GameState.Paused => "游戏暂停",
GameState.GameOver => "游戏结束"
};
}
// Description() 扩展
public static string GetDescription(this GameState state)
{
return typeof(GameState)
.GetMember(state.ToString())
?.GetCustomAttribute<DescriptionAttribute>()
?.Description ?? state.ToString();
}
// 工具方法
public static bool IsFinalState(this GameState state) => state == GameState.GameOver;
public static bool IsPlayingState(this GameState state) => state == GameState.Playing;
public static bool CanPause(this GameState state) => state == GameState.Playing;
// 验证方法
public static bool IsValidTransition(this GameState from, GameState to)
{
return (from, to) switch
{
(GameState.Menu, GameState.Playing) => true,
(GameState.Playing, GameState.Paused) => true,
(GameState.Paused, GameState.Playing) => true,
(GameState.Playing, GameState.GameOver) => true,
_ => false
};
}
}
诊断系统
GF_Logging_001 - 日志字段名冲突
当使用 [Log] 属性时,如果已存在同名字段或属性,会触发此诊断。
示例
// 错误示例:字段名冲突
[Log(fieldName = "Logger")]
public partial class MyClass
{
private readonly ILogger Logger; // ❌ 冲突!
}
// 正确的解决方案
[Log(fieldName = "CustomLogger")]
public partial class MyClass
{
private readonly ILogger CustomLogger; // ✅ 使用不同的字段名
}
诊断消息
error GF_Logging_001: Logger field name 'Logger' conflicts with existing field in type 'MyClass'
GF_Rule_001 - 上下文感知接口冲突
当使用 [ContextAware] 属性时,如果类型已经实现了 IContextAware 接口,会触发此诊断。
示例
// 错误示例:接口冲突
[ContextAware]
public partial class MyClass : IContextAware // ❌ 冲突!
{
public IContextAware.Context Context { get; set; }
public void SetContext(IContextAware.Context context) { }
public IContextAware.Context GetContext() { return Context; }
}
// 正确的解决方案:移除手动实现
[ContextAware]
public partial class MyClass // ✅ 让生成器实现接口
{
// 移除手动实现的代码
}
诊断消息
error GF_Rule_001: Type 'MyClass' already implements 'IContextAware' interface. Remove the [ContextAware] attribute or manual implementation.
通用工具
TypeHelper
类型操作的工具类。
主要方法
public static class TypeHelper
{
// 类型检查
public static bool IsNullable(Type type);
public static bool IsGenericType(Type type);
public static bool IsValueType(Type type);
public static bool IsEnum(Type type);
// 泛型类型信息
public static Type GetGenericTypeDefinition(Type type);
public static Type[] GetGenericArguments(Type type);
public static bool ImplementsInterface(Type type, Type interfaceType);
// 属性信息
public static PropertyInfo[] GetProperties(Type type, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance);
public static PropertyInfo GetProperty(Type type, string name, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance);
public static bool HasProperty(Type type, string name);
// 方法信息
public static MethodInfo[] GetMethods(Type type, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance);
public static MethodInfo GetMethod(Type type, string name, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance);
public static bool HasMethod(Type type, string name);
// 构造函数信息
public static ConstructorInfo[] GetConstructors(Type type, BindingFlags flags = BindingFlags.Public | BindingFlags.Instance);
public static ConstructorInfo GetConstructor(Type type, Type[] parameterTypes);
// 可实例化检查
public static bool HasParameterlessConstructor(Type type);
public static bool HasConstructor(Type type, params Type[] parameterTypes);
}
SymbolHelper
符号操作的工具类。
主要方法
public static class SymbolHelper
{
// 获取符号信息
public static ITypeSymbol GetSymbolInfo(INamedTypeSymbol symbol, Compilation compilation);
public static IMethodSymbol GetMethodInfo(IMethodSymbol symbol);
public static IPropertySymbol GetPropertyInfo(IPropertySymbol symbol);
public static IEventSymbol GetEventInfo(IEventSymbol symbol);
// 符号比较
public static bool IsSameSymbol(ISymbol symbol1, ISymbol symbol2);
public static string GetFullyQualifiedName(ISymbol symbol);
public static string GetDocumentationCommentXml(ISymbol symbol);
// 符号查找
public static IEnumerable<ISymbol> GetMembers(INamedTypeSymbol symbol);
public static ISymbol GetMember(INamedTypeSymbol symbol, string name);
public static IEnumerable<AttributeData> GetAttributes(ISymbol symbol);
public static T GetAttribute<T>(ISymbol symbol);
public static bool HasAttribute<T>(ISymbol symbol);
}
CompilationHelper
编译操作的工具类。
主要方法
public static class CompilationHelper
{
// 获取编译
public static Compilation GetCompilation(Compilation startingCompilation);
public static Compilation GetCompilation(SyntaxTree syntaxTree);
public static Compilation GetCompilation(IEnumerable<SyntaxTree> syntaxTrees);
// 获取语义模型
public static SemanticModel GetSemanticModel(Compilation compilation);
public static SemanticModel GetSemanticModel(SyntaxTree syntaxTree);
// 符号查找
public static INamedTypeSymbol GetDeclaredTypeSymbol(Compilation compilation, string name);
public static IMethodSymbol GetDeclaredMethodSymbol(Compilation compilation, string name);
public static IPropertySymbol GetDeclaredPropertySymbol(Compilation compilation, string name);
// 类型解析
public static INamedTypeSymbol ResolveType(Compilation compilation, string metadataName);
public static ITypeSymbol ResolveType(Compilation compilation, Type type);
public static IMethodSymbol ResolveMethod(Compilation compilation, string methodFullName, params ITypeSymbol[] parameterTypes);
// 编译检查
public static bool HasCompilationErrors(Compilation compilation);
public static IEnumerable<Diagnostic> GetCompilationDiagnostics(Compilation compilation);
public static string GetCompilationErrors(Compilation compilation);
}
配置示例
项目文件配置
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="GeWuYou.GFramework.SourceGenerators" Version="1.0.0" />
<PackageReference Include="GeWuYou.GFramework.SourceGenerators.Attributes" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
<Compile Remove="$(CompilerGeneratedFilesOutputPath)/**/*.cs" />
</ItemGroup>
</Project>
编辑器配置
{
"sourceGenerators": {
"debug": true,
"logLevel": "Information",
"outputDirectory": "Generated",
"enableDocumentation": true,
"enablePerformanceLogging": false
},
"loggingGenerator": {
"defaultFieldName": "Logger",
"defaultAccessLevel": "Private",
"defaultStatic": true,
"defaultMinLevel": "None"
},
"contextAwareGenerator": {
"useLazyInit": false,
"validateContext": false
},
"enumExtensionsGenerator": {
"generateIsMethods": true,
"generateHasMethod": true,
"generateInMethod": true,
"customPrefix": "Is"
}
}
文档版本: 1.0.0
更新日期: 2026-01-12