Example #1
0
        /// <inheritdoc />
        public override object ReadInline(object item, IEdmTypeReference edmType, ODataDeserializerContext readContext)
        {
            if (item == null)
            {
                return(null);
            }

            if (readContext == null)
            {
                throw Error.ArgumentNull(nameof(readContext));
            }

            ODataProperty property = item as ODataProperty;

            if (property != null)
            {
                item = property.Value;
            }

            IEdmEnumTypeReference enumTypeReference = edmType.AsEnum();
            ODataEnumValue        enumValue         = item as ODataEnumValue;

            if (readContext.IsNoClrType)
            {
                Contract.Assert(edmType.TypeKind() == EdmTypeKind.Enum);
                return(new EdmEnumObject(enumTypeReference, enumValue.Value));
            }

            IEdmEnumType enumType = enumTypeReference.EnumDefinition();

            // Enum member supports model alias case. So, try to use the Edm member name to retrieve the Enum value.
            var memberMapAnnotation = readContext.Model.GetClrEnumMemberAnnotation(enumType);

            if (memberMapAnnotation != null)
            {
                if (enumValue != null)
                {
                    IEdmEnumMember enumMember = enumType.Members.FirstOrDefault(m => m.Name == enumValue.Value);
                    if (enumMember != null)
                    {
                        var clrMember = memberMapAnnotation.GetClrEnumMember(enumMember);
                        if (clrMember != null)
                        {
                            return(clrMember);
                        }
                    }
                }
            }

            Type clrType = readContext.Model.GetClrType(edmType);

            return(EnumDeserializationHelpers.ConvertEnumValue(item, clrType));
        }
Example #2
0
        /// <summary>
        /// Creates an <see cref="ODataEnumValue"/> for the object represented by <paramref name="graph"/>.
        /// </summary>
        /// <param name="graph">The enum value.</param>
        /// <param name="enumType">The EDM enum type of the value.</param>
        /// <param name="writeContext">The serializer write context.</param>
        /// <returns>The created <see cref="ODataEnumValue"/>.</returns>
        public virtual ODataEnumValue CreateODataEnumValue(object graph, IEdmEnumTypeReference enumType,
                                                           ODataSerializerContext writeContext)
        {
            if (graph == null)
            {
                return(null);
            }

            string value = null;

            if (TypeHelper.IsEnum(graph.GetType()))
            {
                value = graph.ToString();
            }
            else
            {
                if (graph.GetType() == typeof(EdmEnumObject))
                {
                    value = ((EdmEnumObject)graph).Value;
                }
            }

            // Enum member supports model alias case. So, try to use the Edm member name to create Enum value.
            var memberMapAnnotation = writeContext.Model.GetClrEnumMemberAnnotation(enumType.EnumDefinition());

            if (memberMapAnnotation != null)
            {
                var edmEnumMember = memberMapAnnotation.GetEdmEnumMember((Enum)graph);
                if (edmEnumMember != null)
                {
                    value = edmEnumMember.Name;
                }
            }

            ODataEnumValue enumValue = new ODataEnumValue(value, enumType.FullName());

            ODataMetadataLevel metadataLevel = writeContext != null
                ? writeContext.MetadataLevel
                : ODataMetadataLevel.MinimalMetadata;

            AddTypeNameAnnotationAsNeeded(enumValue, enumType, metadataLevel);

            return(enumValue);
        }
 protected override void ProcessEnumTypeReference(IEdmEnumTypeReference element)
 {
     this.CheckSchemaElementReference(element.EnumDefinition());
 }
 protected override void ProcessEnumTypeReference(IEdmEnumTypeReference element)
 {
     this.CheckSchemaElementReference(element.EnumDefinition());
 }
Example #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="EdmEnumObject"/> class.
 /// </summary>
 /// <param name="edmType">The <see cref="IEdmEnumTypeReference"/> of this object.</param>
 /// <param name="value">The value of the enumeration type.</param>
 public EdmEnumObject(IEdmEnumTypeReference edmType, string value)
     : this(edmType.EnumDefinition(), value, edmType.IsNullable)
 {
 }
Example #6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="EdmEnumObject"/> class.
 /// </summary>
 /// <param name="edmType">The <see cref="IEdmEnumTypeReference"/> of this object.</param>
 /// <param name="value">The value of the enumeration type.</param>
 public EdmEnumObject(IEdmEnumTypeReference edmType, string value)
     : this(edmType.EnumDefinition(), value, edmType.IsNullable)
 {
 }