Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Matthieu fait mumuse avec le générateur de classes d'EDM

Dans les premières specs d'EDM, on devait pouvoir utiliser des types enum dans le csdl. Cependant, même si cette idée n'a pas été abandonnée, ce ne sera pas possible avec la V1.

Ce qu'on peut quand même faire c'est se rajouter une propriété de type notre enum qui encapsule la propriété définie avec EDM. D'où mon idée : pourquoi ne pas le faire faire par le générateur de code en fonction des metadatas du csdl.

En repartant du code de Sanjay Nagamangalam, j'ai modifié la méthode OnTypeGenerated pour obtenir le code suivant :

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);

            }

        }

    }

}

Du coup, les deux propriétés suivantes :

<Property Name="Test" Type="Int32" Nullable="false" xmlns:attr='http://tempuri.org/AttributeEnum' attr:MyCustomAnnotation='ConsoleApplication23.MyEnum' />

<Property Name="Test2" Type="Int32" Nullable="true" xmlns:attr='http://tempuri.org/AttributeEnum' attr:MyCustomAnnotation='ConsoleApplication23.MyEnum' />

donnent le code suivant :

public int Test

{

    get

    {

        return this._Test;

    }

    set

    {

        this.OnTestChanging(value);

        this.ReportPropertyChanging("Test");

        this._Test = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);

        this.ReportPropertyChanged("Test");

        this.OnTestChanged();

    }

}

public global::System.Nullable<int> Test2

{

    get

    {

        return this._Test2;

    }

    set

    {

        this.OnTest2Changing(value);

        this.ReportPropertyChanging("Test2");

        this._Test2 = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value);

        this.ReportPropertyChanged("Test2");

        this.OnTest2Changed();

    }

}

public global::ConsoleApplication23.MyEnum TestEnum

{

    get

    {

        return ((global::ConsoleApplication23.MyEnum)(this.Test));

    }

    set

    {

        this.Test = ((int)(value));

    }

}

public global::System.Nullable<ConsoleApplication23.MyEnum> Test2Enum

{

    get

    {

        if ((this.Test2 == null))

        {

            return null;

        }

        else

        {

            return ((global::ConsoleApplication23.MyEnum)(this.Test2));

        }

    }

    set

    {

        if ((value == null))

        {

            this.Test2 = null;

        }

        else

        {

            this.Test2 = ((int)(value));

        }

    }

}


Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mardi 19 février 2008 02:40 par Matthieu MEZIL

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Microsoft Regional Director 2.0 ! par Le blog de Patrick [MVP Office 365] le 02-23-2015, 22:10

- TechDays Paris 2015: Malware unchained par Blog Technique de Romelard Fabrice le 02-12-2015, 22:58

- TechDays Paris 2015: La transformation du SI avec le Cloud Microsoft, quel sera le rôle de la DSI demain, comment le Cloud MS accompagne cette transfo... par Blog Technique de Romelard Fabrice le 02-12-2015, 22:51

- TechDays Paris 2015: L’intranet social avec Office 365 et Yammer - quelles possibilités d’intégration ? par Blog Technique de Romelard Fabrice le 02-12-2015, 22:46

- TechDays Paris 2015: Plenière jour 3 - Vers une technologie invisible et une intelligence omniprésente ? par Blog Technique de Romelard Fabrice le 02-12-2015, 10:59

- TechDays Paris 2015: Geek is in da {new} House par Blog Technique de Romelard Fabrice le 02-12-2015, 01:13

- TechDays Paris 2015: Windows Server vNext - Virtualisation et Stockage par Blog Technique de Romelard Fabrice le 02-12-2015, 00:26

- TechDays Paris 2015: Quoi de neuf dans Windows 10 ? par Blog Technique de Romelard Fabrice le 02-11-2015, 23:37

- TechDays Paris 2015: Réussir sa migration vers Office 365 en formant les uilisateurs par Blog Technique de Romelard Fabrice le 02-11-2015, 14:32

- TechDays Paris 2015: Windows 10 et PowerShell 5.0 par Blog Technique de Romelard Fabrice le 02-11-2015, 13:10