C#

C# loader 使用指南。

API

Data

public ref readonly ProtobufMessage Data()

获取内部 protobuf message 数据。

Map

  • public MapValueType? Get1(KEY1 k1):获取第 1 层 map 的值。找不到 key 时返回 null
  • public MapValueType? Get2(KEY1 k1, KEY2 k2):获取第 2 层 map 的值。找不到 key 时返回 null

获取第 N 层 map 的值。注意:仅适用于每层 message 的第一个 map 字段

OrderedMap

前提条件:需要在 metasheet 中将 OrderedMap 选项设置为 true

参考 metasheet 选项:OrderedMap

  • public ref readonly OrderedMapMap GetOrderedMap():获取整个有序 map。
  • public OrderedMapValueType? GetOrderedMap1(KEY1 k1):获取第 1 层有序 map 的值。找不到 key 时返回 null

获取第 N 层有序 map 的值。注意:仅适用于每层 message 的第一个 map 字段

Index

前提条件:需要在 metasheet 中适当设置 Index 选项。

参考 metasheet 选项:Index

如果 index 名称为 Chapter,且被索引的 key 为 k1, k2 ...,则访问器为:

  • public ref readonly Index_ChapterMap FindChapterMap():获取整个 hash map。
  • public List<ParentType>? FindChapter(KEY1 k1, KEY2 k2...):按 key 查找值。一个 key 可能对应多个值,以 list 形式返回。
  • public ParentType? FindFirstChapter(KEY1 k1, KEY2 k2...):按 key 查找第一个值,找不到时返回 null

若被索引的 struct 嵌套在上层 map 容器中,则会为每个上层 map 生成额外的 API,以支持快速范围查找。此处 N 表示第 N 层上层 map(例如,1 表示直接父级 map,2 表示祖父级 map,以此类推)。

  • public Index_ChapterMap? FindChapterMapN(MapKey1Type mapKey1, MapKey2Type mapKey2...):获取限定在指定上层 map key 范围内的整个 hash map。
  • public List<ParentType>? FindChapterN(MapKey1Type mapKey1, MapKey2Type mapKey2..., KEY1 k1, KEY2 k2...):在指定上层 map 范围内按 key 查找值。一个 key 可能对应多个值,以 list 形式返回。
  • public ParentType? FindFirstChapterN(MapKey1Type mapKey1, MapKey2Type mapKey2..., KEY1 k1, KEY2 k2...):在指定上层 map 范围内按 key 查找第一个匹配值,找不到时返回 null

OrderedIndex

前提条件:需要在 metasheet 中适当设置 OrderedIndex 选项。

参考 metasheet 选项:OrderedIndex

如果有序 index 名称为 Chapter,且被索引的 key 为 k1, k2 ...,则访问器为:

  • public ref readonly OrderedIndex_ChapterMap FindChapterMap():获取整个有序 map。
  • public List<ParentType>? FindChapter(KEY1 k1, KEY2 k2...):按 key 查找值。一个 key 可能对应多个值,以 list 形式返回。
  • public ParentType? FindFirstChapter(KEY1 k1, KEY2 k2...):按 key 查找第一个值,找不到时返回 null

若被索引的 struct 嵌套在上层 map 容器中,则会为每个上层 map 生成额外的 API,以支持快速范围查找。此处 N 表示第 N 层上层 map(例如,1 表示直接父级 map,2 表示祖父级 map,以此类推)。

  • public OrderedIndex_ChapterMap? FindChapterMapN(MapKey1Type mapKey1, MapKey2Type mapKey2...):获取限定在指定上层 map key 范围内的整个有序 map。
  • public List<ParentType>? FindChapterN(MapKey1Type mapKey1, MapKey2Type mapKey2..., KEY1 k1, KEY2 k2...):在指定上层 map 范围内按 key 查找值。一个 key 可能对应多个值,以 list 形式返回。
  • public ParentType? FindFirstChapterN(MapKey1Type mapKey1, MapKey2Type mapKey2..., KEY1 k1, KEY2 k2...):在指定上层 map 范围内按 key 查找第一个匹配值,找不到时返回 null

自定义 messager

如果内置 API 不能满足业务逻辑需求,可以添加自定义 messager,在其中编写基于已加载配置对象的预处理逻辑。

示例:csharp-tableau-loader/hub/custom

CustomXXXConf.cs

using Tableau;

public class CustomXXXConf : Messager, IMessagerName
{
    public string Name() => "CustomXXXConf";

    public override bool ProcessAfterLoadAll(Hub hub)
    {
        // TODO: 在此实现。
        return true;
    }

    // TODO: 添加自定义数据字段。
}

在初始化代码中注册:

Registry.Register<CustomXXXConf>();

插件:protoc-gen-csharp-tableau-loader

使用此 protoc 插件的示例: csharp-tableau-loader/gen.sh

完整示例

参考 csharp-tableau-loader