using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
public sealed class ExternalProvider
public string ProviderName { get; set; }
public IdentityProviderType IdentityProviderType { get; set; }
public string RemoteEntityIdUrl { get; set; }
public string LocalEntityIdUrl { get; set; }
public Guid Id { get; set; }
public string FirstNameAttribute { get; set; }
public string LastNameAttribute { get; set; }
public string UsernameAttribute { get; set; }
public string EmailAttribute { get; set; }
public PermissionTypeEnum? DefaultLicenseType { get; set; }
public long? DefaultSocRoleId { get; set; }
public string DefaultPermissionGroup { get; set; }
public List<string> DefaultEnvironments { get; set; }
public bool AutoRedirect { get; set; }
public bool AutoAddUser { get; set; }
public bool AllowUnsolicitedResponse { get; set; }
public bool AreSamlSettingsInUse { get; set; }
public UploadSamlSettings PublicCertificate { get; set; }
public UploadSamlSettings Metadata { get; set; }
public class UploadSamlSettings
public SamlSettingsFileType Type { get; set; }
public string Name { get; set; }
public string ContentBase64 { get; set; }
public enum IdentityProviderType
public enum PermissionTypeEnum
[EnumMember] Regular = 0,
[EnumMember] ViewOnly = 1,
[EnumMember] Collaborator = 2,
[EnumMember] ManagedUser = 3,
[EnumMember] ManagedUserPlus = 4
public enum SamlSettingsFileType
public class ExternalProviderMapperDtoBase
public const int MaxContentSize = 5242880;
public string ProviderName { get; set; }
public IdentityProviderType? IdentityProviderType { get; set; }
public string? RemoteEntityIdUrl { get; set; }
public string? LocalEntityIdUrl { get; set; }
public bool? AutoRedirect { get; set; }
public bool? AutoAddUser { get; set; }
public bool? AreSamlSettingsInUse { get; set; }
public UploadSamlSettings? Metadata { get; set; }
public UploadSamlSettings? PublicCertificate { get; set; }
public bool? AllowUnsolicitedResponse { get; set; }
public string? FirstNameAttribute { get; set; }
public string? LastNameAttribute { get; set; }
public string? UsernameAttribute { get; set; }
public string? EmailAttribute { get; set; }
public PermissionTypeEnum? DefaultLicenseType { get; set; }
public long? DefaultSocRoleId { get; set; }
public string? DefaultPermissionGroup { get; set; }
public List<string>? DefaultEnvironments { get; set; }
public sealed class PatchExternalProviderRequest : ExternalProviderMapperDtoBase
public static void Main()
var config = new MapperConfiguration(cfg =>
cfg.AddProfile<DemoProfile>();
IMapper _mapper = config.CreateMapper();
var exp = new ExternalProvider()
IdentityProviderType = 0,
RemoteEntityIdUrl = "http://www.okta.com/exk7hamvfwwzmrS4Z4x7",
LocalEntityIdUrl = "https://localhost:8443/Saml2/",
Id = Guid.Parse("91192ca6-8e3e-446a-8a2e-69f83bc08ee9"),
DefaultPermissionGroup = "Admins",
DefaultEnvironments = new List<string>() {
AllowUnsolicitedResponse = false,
AreSamlSettingsInUse = true,
PublicCertificate = null,
Metadata = new UploadSamlSettings() {
Name = "localHOstDoNotDelete.xml",
ContentBase64 = "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bWQ6RW50aXR5RGVzY3JpcHRvciBlbnRpdHlJRD0iaHR0cDovL3d3dy5va3RhLmNvbS9leGs3aGFtdmZ3d3ptclM0WjR4NyIgeG1sbnM6bWQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDptZXRhZGF0YSI+PG1kOklEUFNTT0Rlc2NyaXB0b3IgV2FudEF1dGhuUmVxdWVzdHNTaWduZWQ9ImZhbHNlIiBwcm90b2NvbFN1cHBvcnRFbnVtZXJhdGlvbj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnByb3RvY29sIj48bWQ6S2V5RGVzY3JpcHRvciB1c2U9InNpZ25pbmciPjxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHM6WDUwOURhdGE+PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlEcERDQ0FveWdBd0lCQWdJR0FYTEcyNFd2TUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdTTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHCkExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlUyRnVJRVp5WVc1amFYTmpiekVOTUFzR0ExVUVDZ3dFVDJ0MFlURVUKTUJJR0ExVUVDd3dMVTFOUFVISnZkbWxrWlhJeEV6QVJCZ05WQkFNTUNtUmxkaTB5TmprMk1qY3hIREFhQmdrcWhraUc5dzBCQ1FFVwpEV2x1Wm05QWIydDBZUzVqYjIwd0hoY05NakF3TmpFNE1EazFOVEUwV2hjTk16QXdOakU0TURrMU5qRTBXakNCa2pFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQWdNQ2tOaGJHbG1iM0p1YVdFeEZqQVVCZ05WQkFjTURWTmhiaUJHY21GdVkybHpZMjh4RFRBTEJnTlYKQkFvTUJFOXJkR0V4RkRBU0JnTlZCQXNNQzFOVFQxQnliM1pwWkdWeU1STXdFUVlEVlFRRERBcGtaWFl0TWpZNU5qSTNNUnd3R2dZSgpLb1pJaHZjTkFRa0JGZzFwYm1adlFHOXJkR0V1WTI5dE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCnBSbi84SDF0S1FtcTNyZlFPYVU3Sm1ybGhJV0cyNHFtYXVpQi8zaVpjYk85TFg0SmxnME8vWU5LZlVPZmRDSlowd05OdHJ4emZMYzgKc3BWQm9WbzNZOEEvclB0SDNHdE5XcTh3VGVDM1c3ajNxS01TUGY0TkdhZVFJT252K3QyVVpueFdSbGVEU3M3UGVTbSsxRmRQOEJxdgo0cHY0bzdrdU1LaWdkYzFjM2RqZTVjcU90V3pmSjFKVGlsNkcxbnpHYU5TVHpER09MZWhYTjJ4SkdpUTVqa3JNQlZXV0lkNmx5TE5JCjhiVWJxUEpWMzNRTWdDN0RWOUtaY2VTZ01ac3pBYmduQXVaNlJXRzd0cjFMa00vSk1ySDdydFgvemQ5cjVxV1dsQVZHdnppVjV4S2gKWlFsQUxlandlMGxGZ0NobHJsajNKY2hRemFGbEtvZVZKWnFVdFFJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFlS1Q1NApDbkxlaVA3K3VDU1ptRDNKMEViS0JvR0d2MlZFcFhpejIvVk9VY2E5bnF5TXFneTJjMUJ3VXorR1lDYW5lYTU4ODNxQmlmU3p0d2NuCmE5WXM0RmxoNEdTc2F1eUJabTRmdEpjTGxIaWZZQVBGYmtBR3BHL2JHd3EwQ1NMTDlOS3I0WGs3UmhLVndWUk1pQU9vQ1lxejR4ZzAKTndjQi9mSTQ2RnFuTk1UdmNDUXNORGJHTFcrSC9CMlpSQ2tOY21VVDFyM3QzbkxERHN0SVlpOENXM0REME85R2hJZDVKT09zMFloMgpWeFU0QStjOWZkelROcXdoRUUzWWs0eXNBa3RVSVVyQkVlcU1VbFdiWElKMlNhY0l4TFlMOTZvRjFFRk1sd080VVBhQm1TZ1BqMkF6CldTU3QrTkZvWHRwd3FBbjRKMlhHMDMrZThvTFpOVWsyPC9kczpYNTA5Q2VydGlmaWNhdGU+PC9kczpYNTA5RGF0YT48L2RzOktleUluZm8+PC9tZDpLZXlEZXNjcmlwdG9yPjxtZDpOYW1lSURGb3JtYXQ+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6dW5zcGVjaWZpZWQ8L21kOk5hbWVJREZvcm1hdD48bWQ6TmFtZUlERm9ybWF0PnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9ybWF0OmVtYWlsQWRkcmVzczwvbWQ6TmFtZUlERm9ybWF0PjxtZDpTaW5nbGVTaWduT25TZXJ2aWNlIEJpbmRpbmc9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpiaW5kaW5nczpIVFRQLVBPU1QiIExvY2F0aW9uPSJodHRwczovL2Rldi0yNjk2Mjcub2t0YS5jb20vYXBwL2Rldi0yNjk2MjdfYW5kcmV5dGVzdF8xL2V4azdoYW12Znd3em1yUzRaNHg3L3Nzby9zYW1sIi8+PG1kOlNpbmdsZVNpZ25PblNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUmVkaXJlY3QiIExvY2F0aW9uPSJodHRwczovL2Rldi0yNjk2Mjcub2t0YS5jb20vYXBwL2Rldi0yNjk2MjdfYW5kcmV5dGVzdF8xL2V4azdoYW12Znd3em1yUzRaNHg3L3Nzby9zYW1sIi8+PC9tZDpJRFBTU09EZXNjcmlwdG9yPjwvbWQ6RW50aXR5RGVzY3JpcHRvcj4="
var patchExternalProviderRequest = new PatchExternalProviderRequest()
var externalProvider = _mapper.Map(patchExternalProviderRequest, exp);
Console.WriteLine(JsonConvert.SerializeObject(externalProvider));
public class DemoProfile : Profile
CreateMap<PatchExternalProviderRequest, ExternalProvider>()
.ForMember(dest => dest.DefaultEnvironments, opt =>
opt.PreCondition((source, _) =>
source.DefaultEnvironments is { Count: > 0 }))
.ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));
public class IgnoreNullResolver : IMemberValueResolver<object, object, object, object>
public object Resolve(object source, object destination, object sourceMember, object destinationMember,
ResolutionContext context)
return sourceMember ?? destinationMember;