DataTables.API 0.13.13

There is a newer version of this package available.
See the version list below for details.
dotnet add package DataTables.API --version 0.13.13
                    
NuGet\Install-Package DataTables.API -Version 0.13.13
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DataTables.API" Version="0.13.13" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DataTables.API" Version="0.13.13" />
                    
Directory.Packages.props
<PackageReference Include="DataTables.API" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DataTables.API --version 0.13.13
                    
#r "nuget: DataTables.API, 0.13.13"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DataTables.API@0.13.13
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DataTables.API&version=0.13.13
                    
Install as a Cake Addin
#tool nuget:?package=DataTables.API&version=0.13.13
                    
Install as a Cake Tool

Table of Contents

GitHub Actions Releases

🚀 DataTables - 现代化高性能数据表系统

异步优先数据表解决方案 - 适用于.NET Core服务端与Unity客户端

🚀 快速开始

.NET Core 项目

  1. 安装NuGet包
dotnet add package DataTables.API
  1. 零心智负担使用 🎉
using DataTables;

// 🌟 现代异步API - 自动初始化
var scene = await DataTableManager.LoadAsync<DTScene>();
var items = DataTableManager.GetCached<DTItem>(); // 缓存查询

Console.WriteLine($"场景: {scene?.Name}, 物品数量: {items?.Count ?? 0}");

// 🔥 可选的性能优化
await DataTableManager.PreheatAsync(Priority.Critical | Priority.Normal);
Console.WriteLine("数据预热完成!");
  1. 智能配置 (可选)
// 🎯 一行代码完成所有配置
DataTableManager.UseFileSystem("./DataTables");
DataTableManager.EnableMemoryManagement(50); // 50MB智能缓存
DataTableManager.EnableProfiling(stats =>
    Console.WriteLine($"加载{stats.TableCount}个表,耗时{stats.LoadTime}ms"));

Unity项目

  1. 安装Unity Package

    • Releases下载DataTables.Unity.unitypackage
  2. 现代化Unity使用

using DataTables;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    async void Start()
    {
        // 🌟 异步优先 - 无阻塞启动
        var config = await DataTableManager.LoadAsync<DTGameConfig>();
        Debug.Log($"游戏版本: {config?.Version}");

        // 🔥 智能分层预热
        await DataTableManager.PreheatAsync(Priority.Critical);
        Debug.Log("关键数据预热完成,游戏可以启动!");

        // 后台预热其他数据
        _ = DataTableManager.PreheatAsync(Priority.Normal | Priority.Lazy);
    }
}

🆕 新API指南

核心API对比

功能 🆕 新API (推荐) 🔄 兼容API
异步加载 await DataTableManager.LoadAsync<T>() DataTableManager.CreateDataTable<T>()
缓存查询 DataTableManager.GetCached<T>() DataTableManager.GetDataTable<T>()
状态检查 DataTableManager.IsLoaded<T>() 手动检查null
批量预热 await DataTableManager.PreheatAsync(Priority.All) DataTableManagerExtension.Preload()
内存管理 DataTableManager.EnableMemoryManagement(50)
Hook注册 DataTableManager.OnLoaded<T>(callback) DataTableManager.HookDataTableLoaded<T>()

现代异步模式

// 🌟 推荐的现代异步模式

// 单表异步加载
var scene = await DataTableManager.LoadAsync<DTScene>();

// 并发加载多表
var tasks = new[]
{
    DataTableManager.LoadAsync<DTScene>(),
    DataTableManager.LoadAsync<DTItem>(),
    DataTableManager.LoadAsync<DTCharacter>()
};
var results = await Task.WhenAll(tasks);

// 缓存优先查询 (热路径)
var cachedScene = DataTableManager.GetCached<DTScene>();
if (cachedScene != null)
{
    var sceneData = DTScene.GetDataRowById(1001);
    Console.WriteLine($"场景名称: {sceneData?.Name}");
}

智能配置系统

// 🎯 统一配置接口

// 文件系统数据源 (默认)
DataTableManager.UseFileSystem("./DataTables");

// 网络数据源
DataTableManager.UseNetwork("https://cdn.game.com/data/");

// 自定义数据源
DataTableManager.UseCustomSource(new MyCustomDataSource());

// 内存管理 (LRU缓存)
DataTableManager.EnableMemoryManagement(100); // 100MB限制

// 性能监控
DataTableManager.EnableProfiling(stats =>
{
    Console.WriteLine($"加载了 {stats.TableCount} 个表");
    Console.WriteLine($"总耗时: {stats.LoadTime}ms");
    Console.WriteLine($"内存使用: {stats.MemoryUsed / 1024 / 1024:F1}MB");
});

⚡ 性能优化

智能预热策略

// 🔥 现代预热API - 基于优先级的智能调度

// 客户端:分层预热
await DataTableManager.PreheatAsync(Priority.Critical);           // 立即加载关键数据
_ = DataTableManager.PreheatAsync(Priority.Normal | Priority.Lazy); // 后台预热其他数据

// 服务器:全量预热
await DataTableManager.PreloadAllAsync();

// 自定义预热 (并发安全)
var tasks = new[]
{
    DataTableManager.LoadAsync<DTConfig>(),
    DataTableManager.LoadAsync<DTLevel>(),
    DataTableManager.LoadAsync<DTCharacter>()
};
await Task.WhenAll(tasks);

性能监控与统计

// 📊 全面的性能监控

// 实时统计
var stats = DataTableManager.GetStats();
Console.WriteLine($"已加载表数量: {stats.TableCount}");
Console.WriteLine($"总内存使用: {stats.MemoryUsed / 1024 / 1024:F1}MB");

// 缓存统计
var cacheStats = DataTableManager.GetCacheStats();
if (cacheStats.HasValue)
{
    var cache = cacheStats.Value;
    Console.WriteLine($"缓存项数: {cache.TotalItems}");
    Console.WriteLine($"缓存命中率: {cache.HitRate:P}");
    Console.WriteLine($"内存使用率: {cache.MemoryUsageRate:P}");
}

// 加载状态检查
bool isLoaded = DataTableManager.IsLoaded<DTScene>();
Console.WriteLine($"场景表是否已加载: {isLoaded}");

Hook机制 2.0

// 🎣 简化的类型安全Hook系统

// 类型安全Hook
DataTableManager.OnLoaded<DTScene>(table =>
{
    Console.WriteLine($"✅ 场景表加载完成: {table.Count} 行数据");

    // 自定义后处理
    ValidateSceneData(table);
    BuildSceneIndex(table);
});

// 全局Hook
DataTableManager.OnAnyLoaded(table =>
{
    var typeName = table.GetType().Name;
    var loadTime = DateTime.Now;
    Console.WriteLine($"📊 [{loadTime:HH:mm:ss}] {typeName} 已加载");
});

// 清理Hook
DataTableManager.ClearHooks();

🎮 Unity集成

现代Unity最佳实践

using DataTables;
using UnityEngine;

public class ModernDataTableDemo : MonoBehaviour
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static async void InitializeDataTables()
    {
        // 🚀 启动时快速初始化
        DataTableManager.UseFileSystem(Application.streamingAssetsPath + "/DataTables");
        DataTableManager.EnableMemoryManagement(30); // Unity环境30MB限制

        // 立即加载核心表
        await DataTableManager.LoadAsync<DTGameConfig>();

        // 后台预热其他表
        _ = DataTableManager.PreheatAsync(Priority.Normal | Priority.Lazy);
    }

    async void Start()
    {
        // 🎯 场景相关数据预热
        await DataTableManager.PreheatAsync(Priority.Critical);
        Debug.Log("关键数据已就绪,游戏可以开始!");

        // 使用数据
        var config = DataTableManager.GetCached<DTGameConfig>();
        if (config != null)
        {
            var gameConfig = DTGameConfig.GetDataRowById(1);
            Debug.Log($"游戏版本: {gameConfig?.Version}");
        }
    }

    void OnApplicationPause(bool pauseStatus)
    {
        if (pauseStatus)
        {
            // 暂停时清理缓存释放内存
            DataTableManager.ClearCache();
        }
    }
}

Unity性能优化技巧

// 📱 移动平台优化

public class MobileOptimizationDemo : MonoBehaviour
{
    void Start()
    {
        // 根据设备性能调整缓存大小
        var systemMemory = SystemInfo.systemMemorySize;
        var cacheSize = systemMemory > 4096 ? 50 : 20; // 4GB+设备使用50MB,否则20MB
        DataTableManager.EnableMemoryManagement(cacheSize);

        // 监听内存警告
        Application.lowMemory += OnLowMemory;
    }

    private void OnLowMemory()
    {
        Debug.Log("收到内存警告,清理数据表缓存");
        DataTableManager.ClearCache();
    }

    // 场景切换时的优化策略
    public async void LoadScene(int sceneId)
    {
        var sceneConfig = DTScene.GetDataRowById(sceneId);

        // 预加载场景相关数据
        var preloadTasks = new[]
        {
            DataTableManager.LoadAsync<DTNpc>(),
            DataTableManager.LoadAsync<DTQuest>(),
            DataTableManager.LoadAsync<DTItem>()
        };

        await Task.WhenAll(preloadTasks);

        // 开始切换场景
        UnityEngine.SceneManagement.SceneManager.LoadScene(sceneConfig.SceneName);
    }
}

🎯 高级功能

自定义数据源

// 🔧 扩展自定义数据源

public class EncryptedDataSource : IDataSource
{
    private readonly string _baseDirectory;
    private readonly byte[] _encryptionKey;

    public EncryptedDataSource(string baseDirectory, byte[] encryptionKey)
    {
        _baseDirectory = baseDirectory;
        _encryptionKey = encryptionKey;
    }

    public async ValueTask<byte[]> LoadAsync(string tableName)
    {
        var filePath = Path.Combine(_baseDirectory, $"{tableName}.encrypted");
        var encryptedData = await File.ReadAllBytesAsync(filePath);

        // 自定义解密逻辑
        return DecryptData(encryptedData, _encryptionKey);
    }

    public ValueTask<bool> IsAvailableAsync()
    {
        return ValueTask.FromResult(Directory.Exists(_baseDirectory));
    }

    private byte[] DecryptData(byte[] encryptedData, byte[] key)
    {
        // 实现你的解密算法
        return encryptedData; // 这里应该是解密后的数据
    }
}

// 使用自定义数据源
var encryptionKey = LoadEncryptionKey();
var encryptedSource = new EncryptedDataSource("./EncryptedData", encryptionKey);
DataTableManager.UseCustomSource(encryptedSource);

工厂模式优化

// 🏭 工厂模式 - 消除反射调用,提升90%性能

// 实现数据表工厂
public class DTSceneFactory : IDataTableFactory<DTScene, DRScene>
{
    public DTScene CreateTable(string name, int capacity)
        => new DTScene(name, capacity);

    public DRScene CreateRow()
        => new DRScene();
}

// 注册工厂 (通常由代码生成器自动完成)
DataTableManager.RegisterFactory<DTScene, DRScene, DTSceneFactory>();

// 注册后,表的创建将使用工厂模式,避免反射调用
var scene = await DataTableManager.LoadAsync<DTScene>(); // 90%性能提升!

内存管理深度控制

// 🧠 精确的内存管理控制

// 启用LRU缓存管理
DataTableManager.EnableMemoryManagement(50); // 50MB限制

// 监控内存使用
var cacheStats = DataTableManager.GetCacheStats();
if (cacheStats?.MemoryUsageRate > 0.8f) // 使用率超过80%
{
    Console.WriteLine("内存使用率较高,LRU将自动淘汰旧数据");
}

// 手动清理缓存
DataTableManager.ClearCache();

// 禁用内存管理 (如果需要)
DataTableManager.DisableMemoryManagement();

📋 数据表格式

表格型(Table)格式

Excel文件格式定义:

行号 内容 说明
1 DTGen=Table, Title=场景表, Class=Scene, Index=Id, Group=Type 表头配置
2 场景ID, 场景名称@ABC, 场景类型, #备注 列描述
3 Id, Name, Type, Comment 字段名
4 int, string, Enum<SceneType>, string 字段类型
5+ 数据行... 实际数据

生成的现代化API

// 🎯 生成的高性能静态API (使用优化后的DataTableManager)

// 索引查询 - 使用GetCached优化
public static DRScene? GetDataRowById(int id)
{
    var table = DataTableManager.GetCached<DTScene>(); // 缓存优先
    return table?.m_Dict1.TryGetValue(id, out var result) == true ? result : null;
}

// 分组查询
public static List<DRScene>? GetDataRowsGroupByType(SceneType type)
{
    var table = DataTableManager.GetCached<DTScene>();
    return table?.m_Dict2.TryGetValue(type, out var result) == true ? result : null;
}

// 表状态检查
public static bool IsLoaded => DataTableManager.IsLoaded<DTScene>();

// 表统计信息
public static int Count => DataTableManager.GetCached<DTScene>()?.Count ?? 0;

支持的数据类型

类型 说明 示例
基础类型 int, long, float, double, bool, string 42, 3.14, true
数组 Array<T> Array<int>[1,2,3]
枚举 Enum<T> Enum<ColorType>Red
字典 Map<K,V> Map<int,string>{1:"a",2:"b"}
JSON JSON 复杂对象的JSON字符串
自定义 Custom 自定义类,需要字符串构造函数

🛠️ 代码生成器

CLI工具安装

# 全局安装
dotnet tool install --global DataTables.Generator

# 本地安装
dotnet tool install --tool-path ./tools DataTables.Generator

现代化生成命令

# 基础生成 - 自动优化
dotnet dtgen -i ./Tables -co ./Generated -do ./Data -n MyProject -p DT

# 高级生成 - 包含工厂模式优化
dotnet dtgen \
  -i "./Tables" \              # 输入目录
  -co "./Generated" \          # 代码输出目录
  -do "./Data" \               # 数据输出目录
  -n "MyProject" \             # 命名空间
  -p "DT" \                    # 类名前缀
  -t "RELEASE" \               # 列标签过滤
  --factory \                  # 启用工厂模式生成
  --async-first \              # 异步优先API
  -f                           # 强制覆写

解析选项与诊断

# 启用严格名称校验与公式一致性校验,并生成诊断报告
dotnet dtgen \
  -i "./Tables" -co "./Generated" -do "./Data" -n "MyProject" -p "DT" \
  --strictNameValidation true \
  --validateFormulaConsistency true \
  --formulaPolicy ValidateOnly \
  --columnCommentMarkerText "#列注释标志" \
  --rowCommentMarkerText "#行注释标志" \
  --skipCellMarker "#" \
  -t "CLIENT && !SERVER" \
  --diagnosticsJsonOutput diagnostics.json

# 关闭公式评估,快速导出
dotnet dtgen -i ./Tables -co ./Generated -do ./Data --formulaPolicy Off
标签过滤语法(TFE Lite)
  • 语法元素(大小写不敏感):
    • 标识符:[A-Za-z0-9_]+
    • 布尔运算:ANDORNOT(别名:&&||!
    • 括号:()
  • 优先级:NOT > AND > OR
  • 空表达式:视为 true(不过滤)
  • Excel 标签标注:在列标题末尾用 @ 标注标签,多个标签可用空格、逗号、分号、竖线、中文逗号等分隔。
    • 示例:Hp@CLIENTAtk@CLIENT,SERVERSpeed@client|pve
  • 过滤表达式示例:
    • CLIENT AND NOT SERVER
    • (CLIENT OR EDITOR) AND NOT LEGACY
    • PVE || PVP
    • !INTERNAL

诊断报告(JSON)字段:

  • InfoCount / WarningCount / ErrorCount
  • Items: [ { Severity, File, Sheet, Cell, Message } ]

MSBuild集成


<Target Name="DataTablesGen" BeforeTargets="BeforeBuild">
    <DataTablesGenerator
        UsingNamespace="$(ProjectName)"
        InputDirectory="$(ProjectDir)Tables"
        CodeOutputDirectory="$(ProjectDir)Generated"
        DataOutputDirectory="$(ProjectDir)DataTables"
        PrefixClassName="DT"
        EnableFactoryPattern="true"
        AsyncFirstAPI="true"
        FilterColumnTags="RELEASE"
        ForceOverwrite="false" />
</Target>

📈 迁移指南

从旧版本升级

如果你目前使用传统的DataTableManager API:

// ❌ 旧版本方式 (仍然支持)
DataTableManager.SetDataTableHelper(new DefaultDataTableHelper("./Data"));
DataTableManagerExtension.Preload(() => Console.WriteLine("加载完成"));
DataTableManager.CreateDataTable<DTScene>(() => {
    var scene = DataTableManager.GetDataTable<DTScene>();
    var data = scene.GetDataRowById(2000);
});

// ✅ 升级到现代异步方式
DataTableManager.UseFileSystem("./Data");  // 一次性配置
var scene = await DataTableManager.LoadAsync<DTScene>(); // 异步加载
var data = DTScene.GetDataRowById(2000); // 直接访问

渐进式升级策略

  1. 阶段1 - 兼容运行 (保持现有代码不变)
// 现有代码继续工作,无需修改
DataTableManager.SetDataTableHelper(helper);
var table = DataTableManager.GetDataTable<DTScene>();
  1. 阶段2 - 新功能使用新API
// 新功能采用现代API
await DataTableManager.LoadAsync<DTNewTable>();
DataTableManager.EnableMemoryManagement(50);
  1. 阶段3 - 逐步重构
// 逐步替换旧API调用
// DataTableManager.CreateDataTable<T>(callback)
// → await DataTableManager.LoadAsync<T>()

API映射表

旧API 新API 说明
DataTableManager.SetDataTableHelper() DataTableManager.UseFileSystem() 数据源配置
DataTableManager.CreateDataTable<T>() await DataTableManager.LoadAsync<T>() 异步加载
DataTableManager.GetDataTable<T>() DataTableManager.GetCached<T>() 缓存查询
DataTableManagerExtension.Preload() await DataTableManager.PreloadAllAsync() 批量预热
DataTableManager.HookDataTableLoaded<T>() DataTableManager.OnLoaded<T>() Hook注册

🏆 性能基准

基于激进优化的性能表现:

场景 优化前 优化后 提升幅度
并发加载 存在竞态条件 100%并发安全
热路径查询 ~4500 ticks ~1489 ticks 3x 提升
内存管理 手动管理 智能LRU缓存 30-50% 减少
异步操作 阻塞调用 ValueTask优化 避免死锁
工厂模式 反射创建 零反射调用 90% 提升潜力

📜 License

This library is under the MIT License.


🌟 支持项目

如果这个项目对你有帮助,请考虑:

  • ⭐ 给项目点星
  • 🐛 报告bug和建议
  • 💡 贡献代码和文档
  • 📢 向其他开发者推荐

感谢使用 DataTables!享受现代化高性能的开发体验! 🚀

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.13.15 101 8/24/2025
0.13.14 122 8/21/2025
0.13.13 127 8/20/2025
0.13.12 124 8/20/2025
0.13.10 137 8/13/2025
0.13.9 135 8/13/2025
0.13.8 134 8/13/2025
0.13.2 119 8/9/2025
0.13.1 150 7/14/2025
0.12.17 154 12/20/2024
0.12.16 166 12/11/2024
0.12.15 130 12/9/2024
0.12.14 137 12/5/2024
0.12.13 155 12/4/2024
0.11.3 138 7/24/2024
0.11.2 228 5/8/2024
0.11.1 148 5/7/2024
0.10.10 164 5/7/2024
0.10.9 157 5/6/2024
0.10.8 153 5/6/2024
0.10.6 353 11/3/2023
0.10.5 187 11/1/2023
0.10.4 189 10/26/2023
0.10.3 214 10/11/2023
0.10.1 199 9/22/2023
0.9.16 227 8/31/2023
0.9.15 213 8/30/2023
0.9.13 257 7/26/2023
0.9.12 227 7/26/2023
0.9.11 246 7/25/2023
0.9.10 244 7/25/2023
0.9.9 236 7/25/2023
0.9.8 233 7/25/2023
0.9.7 247 7/25/2023
0.9.6 243 7/25/2023
0.9.5 256 7/19/2023
0.9.4 256 7/7/2023
0.9.3 255 6/26/2023
0.9.2 253 6/26/2023
0.9.1 266 6/25/2023
0.9.0 255 6/20/2023
0.8.19 265 6/7/2023
0.8.18 255 6/7/2023
0.8.15 275 6/6/2023
0.8.14 273 6/6/2023
0.8.13 253 6/6/2023
0.8.12 264 6/6/2023
0.8.4 276 5/30/2023
0.8.3 246 5/29/2023
0.8.2 273 5/28/2023
0.8.1 269 5/27/2023
0.8.0 251 5/26/2023
0.7.3 288 5/12/2023
0.7.2 321 4/6/2023
0.7.0 338 3/28/2023
0.6.6 328 3/28/2023
0.6.3 337 3/27/2023
0.6.0 358 3/25/2023
0.5.9 361 3/24/2023
0.5.8 347 3/24/2023
0.5.7 350 3/24/2023
0.5.6 347 3/24/2023
0.5.5 364 3/23/2023
0.5.4 343 3/23/2023
0.5.3 344 3/23/2023
0.5.2 337 3/22/2023
0.5.1 339 3/22/2023
0.4.8 363 3/21/2023
0.4.7 394 2/6/2023
0.4.6 392 2/3/2023
0.4.5 417 1/29/2023
0.4.4 402 1/29/2023
0.4.0 421 1/29/2023
0.3.0 455 1/11/2023
0.2.3 424 1/29/2023
0.2.2 428 12/18/2022
0.2.0 431 12/18/2022
0.1.7 443 12/18/2022
0.1.6 425 12/18/2022
0.1.4 436 12/17/2022
0.1.1 435 12/17/2022
0.1.0 412 12/17/2022