/// <summary> /// Generates the necessary setter code to set a value of a document. /// Handles internal/private setters /// </summary> /// <param name="frames"></param> /// <param name="member"></param> /// <param name="variableName"></param> /// <param name="documentType"></param> /// <param name="generatedType"></param> public static void SetMemberValue(this FramesCollection frames, MemberInfo member, string variableName, Type documentType, GeneratedType generatedType) { if (member is PropertyInfo property) { if (property.CanWrite) { if (property.SetMethod.IsPublic) { frames.SetPublicMemberValue(member, variableName, documentType); } else { var setterFieldName = generatedType.InitializeLambdaSetterProperty(member, documentType); frames.Code($"{setterFieldName}({{0}}, {variableName});", new Use(documentType)); } return; } } else if (member is FieldInfo field) { if (field.IsPublic) { frames.SetPublicMemberValue(member, variableName, documentType); } else { var setterFieldName = generatedType.InitializeLambdaSetterProperty(member, documentType); frames.Code($"{setterFieldName}({{0}}, {variableName});", new Use(documentType)); } return; } throw new ArgumentOutOfRangeException(nameof(member), $"MemberInfo {member} is not valid in this usage. "); }