private void CreateRolesProperty(CodeTypeDeclaration type) { CodeMemberProperty property = new CodeMemberProperty(); property.Type = CodeDomUtilities.GetGenericType(typeof(IQueryable), IdentityRole.ClrFullTypeName); property.Attributes = MemberAttributes.Public; property.Name = "Roles"; property.HasSet = false; property.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IQueryableRoleStore", false)); property.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IQueryableRoleStore", true)); if (IdentityRole.LoadAllMethod != null) { property.GetStatements.Add( new CodeMethodReturnStatement( new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(Queryable)), "AsQueryable", CreateMethodInvokeExpression(IdentityRole.Entity, IdentityRole.LoadAllMethod)))); } else { property.GetStatements.Add(CreateThrowInvalidOperationException()); } type.Members.Add(property); }
private void CreateFindByIdGenericMethod(CodeTypeDeclaration type) { if (!CanImplementGenericInterfaces) { return; } CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CodeDomUtilities.GetGenericType(TaskFullTypeName, IdentityRole.ClrFullTypeName); method.Attributes = MemberAttributes.Public; method.Name = "FindByIdAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.KeyTypeName, "roleId")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", true)); if (IdentityRole.LoadByKeyMethod != null) { method.Statements.Add( CreateTaskResult(CreateMethodInvokeExpression(IdentityRole.Entity, IdentityRole.LoadByKeyMethod, new CodeArgumentReferenceExpression("roleId")))); } else { method.Statements.Add( CreateTaskResult(CreateMethodInvokeExpression(IdentityRole.Entity, IdentityRole.LoadByKeyMethodName, CreateStringFormatExpression(new CodeArgumentReferenceExpression("roleId"))))); } type.Members.Add(method); }
private void CreateFindByNameMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CodeDomUtilities.GetGenericType(TaskFullTypeName, IdentityRole.ClrFullTypeName); method.Attributes = MemberAttributes.Public; method.Name = "FindByNameAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "roleName")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", false)); if (CanImplementGenericInterfaces) { method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", true)); } if (IdentityRole.LoadByNameMethod != null) { method.Statements.Add( CreateTaskResult(CreateMethodInvokeExpression(IdentityRole.Entity, IdentityRole.LoadByNameMethod, new CodeArgumentReferenceExpression("roleName")))); } else { method.Statements.Add(CreateThrowInvalidOperationException()); } type.Members.Add(method); }
private static CodeTypeReference GetPrivateImplementationGenericType(LanguageCode language, string typeName, params string[] arguments) { if (typeName == null) { throw new ArgumentNullException("typeName"); } if (arguments == null) { throw new ArgumentNullException("arguments"); } if (arguments.Length == 0) { throw new ArgumentException(null, "arguments"); } int indexOf = typeName.IndexOf('`'); if (indexOf < 0) { indexOf = typeName.Length; } if (language == LanguageCode.CSharp) { string str = typeName.Substring(0, indexOf) + "<"; for (int index = 0; index < arguments.Length; ++index) { if (index > 0) { str += ","; } str += CodeDomUtilities.CreateCSharpEscapedIdentifier(arguments[index]); } return(new CodeTypeReference(str + ">")); } if (language == LanguageCode.VisualBasic) { string str1 = typeName.Substring(0, indexOf) + "(Of "; for (int index = 0; index < arguments.Length; ++index) { if (index > 0) { str1 += ","; } str1 += CodeDomUtilities.CreateVisualBasicEscapedIdentifier(arguments[index]); } return(new CodeTypeReference((str1 + ")").Replace("(Of ", "_").Replace(")", "_"))); } return(CodeDomUtilities.GetGenericType(typeName, arguments)); }
private void ImplementIUser(CodeTypeDeclaration typeDeclaration, bool generic, bool supportGeneric) { if (_identityUser == null) { return; } string keyTypeName = generic ? _identityUser.KeyTypeName : typeof(string).FullName; var iuserCodeTypeReference = new CodeTypeReference("Microsoft.AspNet.Identity.IUser"); var iuserGenericCodeTypeReference = new CodeTypeReference("Microsoft.AspNet.Identity.IUser"); iuserGenericCodeTypeReference.TypeArguments.Add(keyTypeName); if (generic) { iuserCodeTypeReference.TypeArguments.Add(keyTypeName); } CodeDomUtilities.SetInterface(iuserCodeTypeReference); CodeDomUtilities.SetInterface(iuserGenericCodeTypeReference); typeDeclaration.BaseTypes.Add(iuserCodeTypeReference); CodeMemberProperty idProperty = new CodeMemberProperty(); idProperty.Type = new CodeTypeReference(keyTypeName); idProperty.Name = "Id"; idProperty.HasSet = false; idProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), generic ? _identityUser.KeyPropertyName : "EntityKey"))); CodeMemberProperty userNameProperty = new CodeMemberProperty(); userNameProperty.Type = new CodeTypeReference(typeof(string)); userNameProperty.Name = "UserName"; userNameProperty.SetStatements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), _identityUser.UserNameProperty.Name), new CodePropertySetValueReferenceExpression())); userNameProperty.GetStatements.Add(new CodeMethodReturnStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), _identityUser.UserNameProperty.Name))); if (generic || supportGeneric) { idProperty.PrivateImplementationType = GetPrivateImplementationGenericType(InputProducer.LanguageCode, "Microsoft.AspNet.Identity.IUser", keyTypeName); idProperty.ImplementationTypes.Add(iuserGenericCodeTypeReference); userNameProperty.PrivateImplementationType = GetPrivateImplementationGenericType(InputProducer.LanguageCode, "Microsoft.AspNet.Identity.IUser", keyTypeName); userNameProperty.ImplementationTypes.Add(iuserGenericCodeTypeReference); } else { idProperty.PrivateImplementationType = iuserCodeTypeReference; idProperty.ImplementationTypes.Add(iuserCodeTypeReference); userNameProperty.PrivateImplementationType = iuserCodeTypeReference; userNameProperty.ImplementationTypes.Add(iuserCodeTypeReference); } typeDeclaration.Members.Add(idProperty); typeDeclaration.Members.Add(userNameProperty); }
private void CreateFindByIdMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CodeDomUtilities.GetGenericType(TaskFullTypeName, IdentityRole.ClrFullTypeName); method.Attributes = MemberAttributes.Public; method.Name = "FindByIdAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "roleId")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", false)); method.Statements.Add(CreateTaskResult(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(IdentityRole.ClrFullTypeName), "LoadByEntityKey", new CodeArgumentReferenceExpression("roleId")))); type.Members.Add(method); }
private void CreateGetRoleIdMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CodeDomUtilities.GetGenericType(TaskFullTypeName, typeof(string).FullName); method.Attributes = MemberAttributes.Public; method.Name = "GetRoleIdAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", false)); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role")); method.Statements.Add(CreateTaskResult(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.StringKeyPropertyName))); type.Members.Add(method); }
private void CreateAddClaimMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CreateTaskTypeReference(); method.Attributes = MemberAttributes.Public; method.Name = "AddClaimAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role")); method.Parameters.Add(new CodeParameterDeclarationExpression(ClaimFullTypeName, "claim")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleClaimStore", false)); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role")); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("claim")); method.Statements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference(IdentityRoleClaim.ClrFullTypeName), "roleClaim", new CodeObjectCreateExpression(IdentityRoleClaim.ClrFullTypeName))); method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.RoleProperty.Name), new CodeArgumentReferenceExpression("role"))); method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Type"))); method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Value"))); if (IdentityRoleClaim.IssuerProperty != null) { method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.IssuerProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Issuer"))); } if (IdentityRoleClaim.OriginalIssuerProperty != null) { method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.OriginalIssuerProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "OriginalIssuer"))); } if (IdentityRoleClaim.ValueTypeProperty != null) { method.Statements.Add(new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueTypeProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "ValueType"))); } method.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("roleClaim"), "Save")); method.Statements.Add(new CodeMethodInvokeExpression( new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "Add", new CodeVariableReferenceExpression("roleClaim"))); method.Statements.Add(CreateEmptyTaskResult()); type.Members.Add(method); }
private CodeTypeReference GetGenericInterfaceType(string interfaceFullTypeName, string genericType) { CodeTypeReference typeReference; if (genericType != null) { typeReference = CodeDomUtilities.GetGenericType(interfaceFullTypeName, IdentityRole.ClrFullTypeName, genericType); } else { typeReference = CodeDomUtilities.GetGenericType(interfaceFullTypeName, IdentityRole.ClrFullTypeName); } CodeDomUtilities.SetInterface(typeReference); return(typeReference); }
private void CreateDeleteRoleMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CreateTaskTypeReference(); method.Attributes = MemberAttributes.Public; method.Name = "DeleteAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", false)); if (CanImplementGenericInterfaces) { method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleStore", true)); } method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role")); method.Statements.Add(new CodeMethodInvokeExpression(new CodeArgumentReferenceExpression("role"), "Delete")); method.Statements.Add(CreateEmptyTaskResult()); type.Members.Add(method); }
private void CodeDomProducer_CodeDomProduction(object sender, CodeDomProductionEventArgs e) { if (e.EventType == CodeDomProductionEventType.UnitsProducing) { if (e.Argument == null) { return; } foreach (var entity in Project.Entities) { if (!entity.GetAttributeValue("enabled", NamespaceUri, true)) { continue; } CodeTypeDeclaration typeDeclaration = _codeDomProducer.GetType(entity); if (typeDeclaration == null) { continue; } // Class var jsonObjectAttribute = new CodeAttributeDeclaration("Newtonsoft.Json.JsonObjectAttribute"); string optMode = entity.GetAttributeValue("optMode", NamespaceUri, "OptIn"); if (optMode != null) { var memberSerialization = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression("Newtonsoft.Json.MemberSerialization"), optMode); jsonObjectAttribute.Arguments.Add(new CodeAttributeArgument("MemberSerialization", memberSerialization)); } CodeDomUtilities.EnsureAttribute(typeDeclaration, jsonObjectAttribute, true); // Properties foreach (CodeTypeMember member in typeDeclaration.Members) { PropertyDefinition propertyDefinition = null; CodeMemberProperty memberProperty = member as CodeMemberProperty; if (memberProperty != null) { propertyDefinition = UserData.GetPropertyDefinition(memberProperty); } Property property = null; if (propertyDefinition != null && propertyDefinition.Property != null) { property = propertyDefinition.Property; if (!property.GetAttributeValue("enabled", NamespaceUri, true)) { continue; } } else { if (!entity.GetAttributeValue("enabledForNonModelProperties", NamespaceUri, true)) { continue; } } bool?serialized = null; if (property != null) { serialized = property.GetAttributeValue("includeInSerialization", NamespaceUri, (bool?)null); } if (serialized == null) { //[System.NonSerializedAttribute()] => false //[System.Xml.Serialization.XmlIgnoreAttribute()] => false //[System.Runtime.Serialization.DataMemberAttribute()] => true if (CodeDomUtilities.GetAttribute(member, typeof(NonSerializedAttribute)) != null) { serialized = false; } else if (CodeDomUtilities.GetAttribute(member, typeof(XmlIgnoreAttribute)) != null) { serialized = false; } else if (CodeDomUtilities.GetAttribute(member, typeof(DataMemberAttribute)) != null) { serialized = true; } else if (CodeDomUtilities.GetAttribute(member, typeof(XmlAttribute)) != null) { serialized = true; } else if (CodeDomUtilities.GetAttribute(member, typeof(XmlElementAttribute)) != null) { serialized = true; } else if (property != null) { serialized = property.IsIncludedInSerialization; } } // [JsonIgnore] or [JsonProperty] if (serialized != null) { var jsonPropertyAttribute = new CodeAttributeDeclaration(); jsonPropertyAttribute.Name = serialized == true ? "Newtonsoft.Json.JsonPropertyAttribute" : "Newtonsoft.Json.JsonIgnoreAttribute"; CodeDomUtilities.EnsureAttribute(member, jsonPropertyAttribute, true); } } } } }
private void CreateGetClaimsMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); CodeTypeReference returnType = CreateTaskTypeReference(); returnType.TypeArguments.Add(CodeDomUtilities.GetGenericType(typeof(IList <>), ClaimFullTypeName)); method.ReturnType = returnType; method.Attributes = MemberAttributes.Public; method.Name = "GetClaimsAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleClaimStore", false)); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role")); method.Statements.Add(new CodeVariableDeclarationStatement(CodeDomUtilities.GetGenericType(typeof(IList <>), ClaimFullTypeName), "result", new CodeObjectCreateExpression(CodeDomUtilities.GetGenericType(typeof(List <>), ClaimFullTypeName)))); var enumerator = new CodeVariableDeclarationStatement(CodeDomUtilities.GetGenericType(typeof(IEnumerator <>), IdentityRoleClaim.ClrFullTypeName), "enumerator"); enumerator.InitExpression = new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "GetEnumerator"); var iteration = new CodeIterationStatement(); iteration.InitStatement = enumerator; iteration.TestExpression = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("enumerator"), "MoveNext"); iteration.IncrementStatement = new CodeSnippetStatement(""); iteration.Statements.Add(new CodeVariableDeclarationStatement(IdentityRoleClaim.ClrFullTypeName, "roleClaim", new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("enumerator"), "Current"))); var createExpression = new CodeObjectCreateExpression(ClaimFullTypeName); if (IdentityRoleClaim.OriginalIssuerProperty != null) { createExpression.Parameters.Insert(0, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.OriginalIssuerProperty.Name)); } if (IdentityRoleClaim.IssuerProperty != null) { createExpression.Parameters.Insert(0, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.IssuerProperty.Name)); } else if (createExpression.Parameters.Count > 0) { createExpression.Parameters.Insert(0, createExpression.Parameters[0]); // OriginalIssuer } if (IdentityRoleClaim.ValueTypeProperty != null) { createExpression.Parameters.Insert(0, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueTypeProperty.Name)); } else if (createExpression.Parameters.Count > 0) { createExpression.Parameters.Insert(0, new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(ClaimValueTypesFullTypeName), "String")); } createExpression.Parameters.Insert(0, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueProperty.Name)); createExpression.Parameters.Insert(0, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name)); iteration.Statements.Add( new CodeMethodInvokeExpression( new CodeVariableReferenceExpression("result"), "Add", createExpression)); method.Statements.Add(iteration); method.Statements.Add(CreateTaskResult(new CodeVariableReferenceExpression("result"))); type.Members.Add(method); }
private void CreateRemoveClaimMethod(CodeTypeDeclaration type) { CodeMemberMethod method = new CodeMemberMethod(); method.ReturnType = CreateTaskTypeReference(); method.Attributes = MemberAttributes.Public; method.Name = "RemoveClaimAsync"; method.Parameters.Add(new CodeParameterDeclarationExpression(IdentityRole.ClrFullTypeName, "role")); method.Parameters.Add(new CodeParameterDeclarationExpression(ClaimFullTypeName, "claim")); method.ImplementationTypes.Add(GetGenericInterfaceType("Microsoft.AspNet.Identity.IRoleClaimStore", false)); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("role")); method.Statements.Add(CodeDomUtilities.CreateParameterThrowIfNull("claim")); /* * List<RoleClaim> toDelete = new List<RoleClaim>(); * foreach (var roleClaim in role.Claims) * { * if (roleClaim.Equals(claim)) * { * toDelete.Add(roleClaim); * } * }*/ method.Statements.Add(new CodeVariableDeclarationStatement(CodeDomUtilities.GetGenericType(typeof(IList <>), IdentityRoleClaim.ClrFullTypeName), "toDelete", new CodeObjectCreateExpression(CodeDomUtilities.GetGenericType(typeof(List <>), IdentityRoleClaim.ClrFullTypeName)))); var roleClaimsEnumerator = CodeDomUtilities.GetUniqueVariable(method, CodeDomUtilities.GetGenericType(typeof(IEnumerator <>), IdentityRoleClaim.ClrFullTypeName), "enumerator"); roleClaimsEnumerator.InitExpression = new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "GetEnumerator"); var roleClaimsIteration = new CodeIterationStatement(); roleClaimsIteration.InitStatement = roleClaimsEnumerator; roleClaimsIteration.TestExpression = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(roleClaimsEnumerator.Name), "MoveNext"); roleClaimsIteration.IncrementStatement = new CodeSnippetStatement(""); method.Statements.Add(roleClaimsIteration); roleClaimsIteration.Statements.Add(new CodeVariableDeclarationStatement(IdentityRoleClaim.ClrFullTypeName, "roleClaim", new CodePropertyReferenceExpression(new CodeVariableReferenceExpression(roleClaimsEnumerator.Name), "Current"))); CodeConditionStatement claimsEqual = new CodeConditionStatement(); roleClaimsIteration.Statements.Add(claimsEqual); claimsEqual.Condition = CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Type")); if (IdentityRoleClaim.ValueProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, true)) { claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd, CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.TypeProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Type"))); } if (IdentityRoleClaim.ValueTypeProperty != null && IdentityRoleClaim.ValueTypeProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false)) { claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd, CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.ValueTypeProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "ValueType"))); } if (IdentityRoleClaim.IssuerProperty != null && IdentityRoleClaim.IssuerProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false)) { claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd, CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.IssuerProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "Issuer"))); } if (IdentityRoleClaim.OriginalIssuerProperty != null && IdentityRoleClaim.OriginalIssuerProperty.GetAttributeValue("isComparer", Constants.NamespaceUri, false)) { claimsEqual.Condition = new CodeBinaryOperatorExpression(claimsEqual.Condition, CodeBinaryOperatorType.BooleanAnd, CreateStringEqualsExpression(StringComparison.OrdinalIgnoreCase, new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("roleClaim"), IdentityRoleClaim.OriginalIssuerProperty.Name), new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("claim"), "OriginalIssuer"))); } claimsEqual.TrueStatements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("toDelete"), "Add", new CodeVariableReferenceExpression("roleClaim"))); /* * foreach (var roleClaim in toDelete) * { * roleClaim.Delete(); * role.Claims.Remove(roleClaim); * } */ var toDeleteEnumerator = CodeDomUtilities.GetUniqueVariable(method, CodeDomUtilities.GetGenericType(typeof(IEnumerator <>), IdentityRoleClaim.ClrFullTypeName), "enumerator"); toDeleteEnumerator.InitExpression = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("toDelete"), "GetEnumerator"); var toDeleteIteration = new CodeIterationStatement(); toDeleteIteration.InitStatement = toDeleteEnumerator; toDeleteIteration.TestExpression = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(toDeleteEnumerator.Name), "MoveNext"); toDeleteIteration.IncrementStatement = new CodeSnippetStatement(""); method.Statements.Add(toDeleteIteration); toDeleteIteration.Statements.Add(new CodeVariableDeclarationStatement(IdentityRoleClaim.ClrFullTypeName, "roleClaim", new CodePropertyReferenceExpression(new CodeVariableReferenceExpression(toDeleteEnumerator.Name), "Current"))); toDeleteIteration.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("roleClaim"), "Delete")); toDeleteIteration.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeArgumentReferenceExpression("role"), IdentityRole.ClaimsProperty.Name), "Remove", new CodeVariableReferenceExpression("roleClaim"))); method.Statements.Add(CreateEmptyTaskResult()); type.Members.Add(method); }