// Add code for each of the fields void GenerateFieldImplementation(StringBuilder builder, CodegenClassMember member) { builder.AppendLine($" if(fieldHash == {member.FieldHash}) {{"); if (member.InfoWrapper.IsPublic()) { builder.AppendLine($" behaviour.{member.FieldName} = value as {member.FieldType};"); } else { switch (member.InfoWrapper.MemberInfo.MemberType) { case MemberTypes.Field: builder.AppendLine($" behaviour.GetType().GetField(\"{ member.FieldName}\", BindingFlags.Instance|BindingFlags.NonPublic).SetValue(behaviour, value); "); break; case MemberTypes.Property: builder.AppendLine($" behaviour.GetType().GetProperty(\"{ member.FieldName}\", BindingFlags.Instance|BindingFlags.NonPublic).SetValue(behaviour, value); "); break; default: break; } } builder.AppendLine($" return;"); builder.AppendLine(" }"); }
// Given a classHash, collect data required to populate a CodegenClassMember from the FieldInfo private void AddMember(int classHash, MemberInfo member) { // Attempt to resolve the CodegenClass to which this field belongs CodegenClass destClass = null; foreach (var c in Classes) { if (c.ClassHash == classHash) { destClass = c; break; } } Debug.Assert(destClass != null); // Ensure we don't already know about the field string fieldName = member.Name; int fieldHash = fieldName.GetHashCode(); foreach (var f in destClass.Members) { if (f.FieldHash == fieldHash) { Debug.Assert(fieldName.Equals(f.FieldName)); return; } } // Create the collection of data we need for the CodegenClassMember instance CodegenClassMember newMember = new CodegenClassMember(fieldName, member, fieldHash); destClass.Members.Add(newMember); }