bean.sbn 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using Luban;
  2. using Newtonsoft.Json.Linq;
  3. {{
  4. parent_def_type = __bean.parent_def_type
  5. export_fields = __bean.export_fields
  6. hierarchy_export_fields = __bean.hierarchy_export_fields
  7. }}
  8. {{namespace_with_grace_begin __namespace_with_top_module}}
  9. {{~if __bean.comment != '' ~}}
  10. /// <summary>
  11. /// {{escape_comment __bean.comment}}
  12. /// </summary>
  13. {{~end~}}
  14. {{~
  15. func get_ref_name
  16. ret (format_property_name __code_style $0.name) + '_Ref'
  17. end
  18. func get_index_var_name
  19. ret (format_property_name __code_style $0.name) + '_Index'
  20. end
  21. func generate_resolve_field_ref
  22. field = $0
  23. fieldName = format_property_name __code_style field.name
  24. refTable = get_ref_table field
  25. if can_generate_ref field
  26. tableName = format_property_name __code_style refTable.name
  27. if field.is_nullable
  28. ret (get_ref_name field) + ' = ' + fieldName + '!= null ? tables.' + tableName + '.GetOrDefault(' + (get_value_of_nullable_type field.ctype fieldName) + ') : null;'
  29. else
  30. ret (get_ref_name field) + ' = tables.' + tableName + '.GetOrDefault(' + fieldName + ');'
  31. end
  32. else if can_generate_collection_ref field
  33. collection_ref_table = get_collection_ref_table field
  34. tableName = format_property_name __code_style collection_ref_table.name
  35. if field.ctype.type_name == 'list' || field.ctype.type_name == 'set'
  36. line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
  37. line2 = 'foreach (var _v in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(tables.' + tableName + '.GetOrDefault(_v)); }' + '\n'
  38. ret line1 + line2
  39. else if field.ctype.type_name == 'array'
  40. line1 = (get_ref_name field) + ' = new ' + (declaring_type_name collection_ref_table.value_ttype) + '[' + fieldName + '.Length];' + '\n'
  41. line2 = 'for (int _i = 0; _i < ' + fieldName + '.Length; _i++) { ' + (get_ref_name field) + '[_i] = tables.' + tableName + '.GetOrDefault(' + fieldName + '[_i]); }' + '\n'
  42. ret line1 + line2
  43. else if field.ctype.type_name == 'map'
  44. line1 = (get_ref_name field) + ' = new ' + (declaring_collection_ref_name field.ctype) + '();' + '\n'
  45. line2 = 'foreach (var kvp in ' + fieldName + ') { ' + (get_ref_name field) + '.Add(kvp.Key, tables.' + tableName + '.GetOrDefault(kvp.Value)); }' + '\n'
  46. ret line1 + line2
  47. else
  48. ret ''
  49. end
  50. else
  51. if (is_field_bean_need_resolve_ref field)
  52. ret fieldName + '?.ResolveRef(tables);'
  53. else if (is_field_array_like_need_resolve_ref field)
  54. ret 'foreach (var _e in ' + fieldName + ') { _e?.ResolveRef(tables); }'
  55. else if (is_field_map_need_resolve_ref field)
  56. ret 'foreach (var _e in ' + fieldName + '.Values) { _e?.ResolveRef(tables); }'
  57. else
  58. ret ''
  59. end
  60. end
  61. end
  62. ~}}
  63. {{~if __bean.is_value_type~}}
  64. public partial struct {{__name}}
  65. {{~else~}}
  66. public {{class_modifier __bean}} partial class {{__name}} : {{if parent_def_type}}{{__bean.parent}}{{else}}Luban.BeanBase{{end}}
  67. {{~end~}}
  68. {
  69. public {{__name}}(JToken _buf) {{if parent_def_type}} : base(_buf) {{end}}
  70. {
  71. JObject _obj = _buf as JObject;
  72. {{~ for field in export_fields
  73. fieldName = format_property_name __code_style field.name
  74. ~}}
  75. {{deserialize_field fieldName '_obj' field.name field.ctype}}
  76. {{~if can_generate_ref field~}}
  77. {{get_ref_name field}} = null;
  78. {{~end~}}
  79. {{~if has_index field~}}
  80. foreach(var _v in {{fieldName}})
  81. {
  82. {{get_index_var_name field}}.Add(_v.{{format_property_name __code_style (get_index_field field).name}}, _v);
  83. }
  84. {{~end~}}
  85. {{~end~}}
  86. }
  87. public static {{__name}} Deserialize{{__name}}(JToken _buf)
  88. {
  89. {{~if __bean.is_abstract_type~}}
  90. var _obj=_buf as JObject;
  91. switch (_obj.GetValue("$type").ToString())
  92. {
  93. {{~for child in __bean.hierarchy_not_abstract_children~}}
  94. case "{{impl_data_type child __bean}}": return new {{child.full_name}}(_buf);
  95. {{~end~}}
  96. default: throw new SerializationException();
  97. }
  98. {{~else~}}
  99. return new {{__bean.full_name}}(_buf);
  100. {{~end~}}
  101. }
  102. {{~ for field in export_fields ~}}
  103. {{~if field.comment != '' ~}}
  104. /// <summary>
  105. /// {{escape_comment field.comment}}
  106. /// </summary>
  107. {{~end~}}
  108. public readonly {{declaring_type_name field.ctype}} {{format_property_name __code_style field.name}};
  109. {{~if can_generate_ref field~}}
  110. public {{declaring_type_name (get_ref_type field)}} {{get_ref_name field}};
  111. {{~else if can_generate_collection_ref field~}}
  112. public {{declaring_collection_ref_name field.ctype}} {{get_ref_name field}};
  113. {{~end~}}
  114. {{~if has_index field
  115. indexMapType = get_index_map_type field
  116. ~}}
  117. public readonly {{declaring_type_name indexMapType}} {{get_index_var_name field}} = new {{declaring_type_name indexMapType}}();
  118. {{~end~}}
  119. {{~end~}}
  120. {{~if !__bean.is_abstract_type && !__bean.is_value_type~}}
  121. public const int __ID__ = {{__bean.id}};
  122. public override int GetTypeId() => __ID__;
  123. {{~end~}}
  124. public {{method_modifier __bean}} void ResolveRef({{__manager_name}} tables)
  125. {
  126. {{~if parent_def_type~}}
  127. base.ResolveRef(tables);
  128. {{~end~}}
  129. {{~for field in export_fields~}}
  130. {{~ line = generate_resolve_field_ref field ~}}
  131. {{~ if line != ''~}}
  132. {{line}}
  133. {{~end~}}
  134. {{~end~}}
  135. }
  136. public override string ToString()
  137. {
  138. return "{{full_name}}{ "
  139. {{~for field in hierarchy_export_fields ~}}
  140. + "{{format_field_name __code_style field.name}}:" + {{to_pretty_string (format_property_name __code_style field.name) field.ctype}} + ","
  141. {{~end~}}
  142. + "}";
  143. }
  144. }
  145. {{namespace_with_grace_end __namespace_with_top_module}}