flatc仅为没有结构成员的表生成静态方法'Create ...',因为必须内联创建结构。
我认为flatc可以生成基于对象的api(--gen-object-api)并使用为对象基础api生成的'... T'类时,可以生成'Create ...'方法(例如Vec3T)作为参数类型。 然后,可以在“ Create ...”方法内部调用结构的静态Pack方法(例如Vec3)以内联方式创建它。 我尝试过了,这就是为TableInFirstNS示例生成的flatc:
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);
}
};
那不是有用的扩展吗?