private void OnTypeGenerated(object sender, TypeGeneratedEventArgs eventArgs)
{
eventArgs.AdditionalAttributes.AddRange(CreateCodeAttributes(eventArgs.TypeSource));
// MM
var entityType = eventArgs.TypeSource as System.Data.Metadata.Edm.EntityType;
if (entityType != null)
{
foreach (var prop in entityType.Properties)
{
var metadataProp = prop.MetadataProperties.Where(mp => mp.Name == "http://tempuri.org/AttributeEnum:MyCustomAnnotation").FirstOrDefault();
string enumTypeName;
var propPrimitiveType = prop.TypeUsage.EdmType as System.Data.Metadata.Edm.PrimitiveType;
if (metadataProp != null && propPrimitiveType != null && !string.IsNullOrEmpty(enumTypeName = metadataProp.Value.ToString()))
{
var propType = propPrimitiveType.ClrEquivalentType.FullName;
var newProp = new CodeMemberProperty { Name = prop.Name + "Enum", Attributes = MemberAttributes.Public | MemberAttributes.Final };
if (prop.Nullable)
{
var nullableEnumTypeName = "global::System.Nullable<" + enumTypeName + ">";
newProp.Type = new CodeTypeReference(nullableEnumTypeName);
newProp.GetStatements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(
new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name), CodeBinaryOperatorType.IdentityEquality,
new CodePrimitiveExpression(null)), new CodeStatement[] { new CodeMethodReturnStatement(new CodePrimitiveExpression(null)) },
new CodeStatement[]{new CodeMethodReturnStatement(new CodeCastExpression(new CodeTypeReference("global::" + enumTypeName),
new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name)))}));
newProp.SetStatements.Add(new CodeConditionStatement(new CodeBinaryOperatorExpression(
new CodeArgumentReferenceExpression("value"), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(null)),
new CodeStatement[]{new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name),
new CodePrimitiveExpression(null))},
new CodeStatement[]{new CodeAssignStatement(new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name),
new CodeCastExpression(new CodeTypeReference(propType),
new CodeArgumentReferenceExpression("value")))}));
}
else
{
enumTypeName = "global::" + enumTypeName;
newProp.Type = new CodeTypeReference(enumTypeName);
newProp.GetStatements.Add(new CodeMethodReturnStatement(new CodeCastExpression(new CodeTypeReference(enumTypeName),
new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name))));
newProp.SetStatements.Add(
new CodeAssignStatement(
new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), prop.Name),
new CodeCastExpression(new CodeTypeReference(propType), new CodeArgumentReferenceExpression("value"))));
}
eventArgs.AdditionalMembers.Add(newProp);
}
}
}
}