/// <summary> /// Enumerate members which will be serialized for the given type. /// /// Note that these members are generated ahead of time with a source gneerator, /// and cannot be changed at runtime. /// </summary> public IEnumerable <SerializableMember> EnumerateMembersToSerialize(TypeInfo forType) { var paired = GetPairedType(forType, SERIALIZER_KIND); if (paired == null) { return(Enumerable.Empty <SerializableMember>()); } var colNamesField = paired.GetFieldNonNull("ColumnNames", PublicStatic); var colNames = (ImmutableArray <string>)colNamesField.GetValueNonNull(null); var ret = ImmutableArray.CreateBuilder <SerializableMember>(colNames.Length); for (var i = 0; i < colNames.Length; i++) { var name = colNames[i]; var colWriterName = $"__Column_{i}"; var colWriterMtd = paired.GetMethodNonNull(colWriterName, PublicStatic); #pragma warning disable CS0618 // This is obsolete to prevent clients from using them, but they are fine for us. var emitsDefaultValue = colWriterMtd.GetCustomAttribute <DoesNotEmitDefaultValueAttribute>() == null; #pragma warning restore CS0618 var shouldSerializeName = $"__Column_{i}_ShouldSerialize"; var shouldSerializeMtd = paired.GetMethod(shouldSerializeName, PublicStatic); var shouldSerialize = (ShouldSerialize?)shouldSerializeMtd; var getterName = $"__Column_{i}_Getter"; var getterMtd = paired.GetMethodNonNull(getterName, PublicStatic); var getter = Getter.ForMethod(getterMtd); var formatterName = $"__Column_{i}_Formatter"; var formatterMtd = paired.GetMethod(formatterName, PublicStatic); Formatter formatter; if (formatterMtd == null) { // if a method isn't provided, it must be using the default formatter = Utils.NonNull(Formatter.GetDefault(getter.Returns)); } else { formatter = Formatter.ForMethod(formatterMtd); } ret.Add(SerializableMember.ForGeneratedMethod(name, colWriterMtd, getter, formatter, shouldSerialize, emitsDefaultValue)); } return(ret.ToImmutable()); }