protected void member(string name, string type, params string[] options) { if (_curStructDef == null) { throw new Exception("member allowed only in define_struct"); } MemberDef md = new MemberDef { Name = name, TypeName = type }; _curStructDef.Members.Add(md); }
/// <summary> /// Compares two object instances, determining its data field (not properties) differences. /// Uses reflection or Entity-getters to access instance data, whatever is more appropriate. /// </summary> /// <typeparam name="TInstance">Type of the instances to compare.</typeparam> /// <param name="Primary">First instance to compare.</param> /// <param name="Secondary">Second instance to compare.</param> /// <param name="ValuesEqualityComparer">Determines, returning true, if the supplied two objects are/represents the same value. Optional. By default, compared with IsEqual().</param> /// <returns>Null if instances are equal. Else, the detected differences, informing field-name plus primary and secondary field values.</returns> public static Dictionary <string, Tuple <object, object> > DetermineDifferences <TInstance>(TInstance Primary, TInstance Secondary, Func <object, object, bool> ValuesEqualityComparer = null) { if (Primary.IsEqual(Secondary)) { return(null); } var Result = new Dictionary <string, Tuple <object, object> >(); var PrimaryInstance = Primary as IMModelClass; var SecondaryInstance = Secondary as IMModelClass; ValuesEqualityComparer = ValuesEqualityComparer.NullDefault(IsEqual); if (PrimaryInstance != null && SecondaryInstance != null) { foreach (var MemberDef in PrimaryInstance.ClassDefinition.Properties) { var PrimaryValue = MemberDef.Read(PrimaryInstance); var SecondaryValue = MemberDef.Read(SecondaryInstance); if (!ValuesEqualityComparer(PrimaryValue, SecondaryValue)) { Result.Add(MemberDef.TechName, Tuple.Create <object, object>(PrimaryValue, SecondaryValue)); } } } else { foreach (var MemberDef in typeof(TInstance).GetFields()) { var PrimaryValue = MemberDef.GetValue(Primary); var SecondaryValue = MemberDef.GetValue(Secondary); if (!ValuesEqualityComparer(PrimaryValue, SecondaryValue)) { Result.Add(MemberDef.Name, Tuple.Create <object, object>(PrimaryValue, SecondaryValue)); } } } return(Result.Count < 1 ? null : Result); }
private void DeserializeMembers(Json.Expression members, ref MemberDef[] memberDefs) { // // TODO: confirm this behavior, technically "optional" in Bonsai spec, so value could be null. // if (members is not Json.ArrayExpression memberTable) { throw new BonsaiParseException("Expected a JSON array containing the members table.", members); } var n = memberTable.ElementCount; memberDefs = new MemberDef[n]; for (var i = 0; i < n; i++) { var member = memberTable.GetElement(i); var memberDef = MemberDef.FromJson(this, member); memberDefs[i] = memberDef; } }
public RecordDef(string name, string baseTypeName = null, RecordDefFlags flags = 0, string comment = null, MemberDef[] members = null) { Name = name; BaseTypeName = baseTypeName; Flags = flags; Comment = comment; Members = members; }
/// <summary> Adds a new entity into <see cref="DeclaredEntities" />. </summary> internal void RegisterEntity(MemberDef member, IEntity entity) { declaredEntities.Add(member.Signature, entity); SymbolLoader.RegisterDeclaredEntity(entity, member.Signature); }