flat c генерирует stati c метод 'Create ...' только для таблиц без членов структуры, потому что структура должна создаваться inline.
Я думаю, что flat c может генерировать Метод 'Create ...', когда он также генерирует объектный API (--gen-object-api) и использует класс '... T', сгенерированный для базового API объекта (например, Vec3T) в качестве типа параметра. Внутри метода «Create ...» он может затем вызвать метод stati c Pack структуры (например, Vec3), чтобы создать его встроенным. Я попробовал это, и это то, что плоский c затем генерируется для примера TableInFirstNS:
public struct TableInFirstNS : IFlatbufferObject
{
...
public static Offset<NamespaceA.TableInFirstNS> CreateTableInFirstNS(FlatBufferBuilder builder,
Offset<NamespaceA.NamespaceB.TableInNestedNS> foo_tableOffset = default(Offset<NamespaceA.NamespaceB.TableInNestedNS>),
NamespaceA.NamespaceB.EnumInNestedNS foo_enum = NamespaceA.NamespaceB.EnumInNestedNS.A,
StructInNestedNST foo_struct = null) {
builder.StartTable(3);
TableInFirstNS.AddFooStruct(builder, NamespaceA.NamespaceB.StructInNestedNS.Pack(builder, foo_struct));
TableInFirstNS.AddFooTable(builder, foo_tableOffset);
TableInFirstNS.AddFooEnum(builder, foo_enum);
return TableInFirstNS.EndTableInFirstNS(builder);
}
...
public static Offset<NamespaceA.TableInFirstNS> Pack(FlatBufferBuilder builder, TableInFirstNST _o) {
if (_o == null) return default(Offset<NamespaceA.TableInFirstNS>);
var _foo_table = _o.FooTable == null ? default(Offset<NamespaceA.NamespaceB.TableInNestedNS>) : NamespaceA.NamespaceB.TableInNestedNS.Pack(builder, _o.FooTable);
return CreateTableInFirstNS(
builder,
_foo_table,
_o.FooEnum,
_o.FooStruct);
}
};
, и это сгенерированный код для примера ArrayTable:
public struct ArrayTable : IFlatbufferObject
{
...
public static Offset<MyGame.Example.ArrayTable> CreateArrayTable(FlatBufferBuilder builder,
ArrayStructT a = null) {
builder.StartTable(1);
ArrayTable.AddA(builder, MyGame.Example.ArrayStruct.Pack(builder, a));
return ArrayTable.EndArrayTable(builder);
}
...
public static Offset<MyGame.Example.ArrayTable> Pack(FlatBufferBuilder builder, ArrayTableT _o) {
if (_o == null) return default(Offset<MyGame.Example.ArrayTable>);
return CreateArrayTable(
builder,
_o.A);
}
};
не будет это будет полезным расширением?