1 // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
2 
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.Dynamic;
6 using System.Web.Script.Serialization;
7 using Microsoft.Internal.Web.Utils;
8 
9 namespace System.Web.Helpers
10 {
11     /// <summary>
12     /// Converter that knows how to get the member values from a dynamic object.
13     /// </summary>
14     internal class DynamicJavaScriptConverter : JavaScriptConverter
15     {
16         public override IEnumerable<Type> SupportedTypes
17         {
18             get
19             {
20                 // REVIEW: For some reason the converters don't pick up interfaces
21                 yield return typeof(IDynamicMetaObjectProvider);
22                 yield return typeof(DynamicObject);
23             }
24         }
25 
Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)26         public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
27         {
28             throw new NotSupportedException();
29         }
30 
Serialize(object obj, JavaScriptSerializer serializer)31         public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
32         {
33             var values = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
34             var memberNames = DynamicHelper.GetMemberNames(obj);
35 
36             // This should never happen
37             Debug.Assert(memberNames != null);
38 
39             // Get the value for each member in the dynamic object
40             foreach (string memberName in memberNames)
41             {
42                 values[memberName] = DynamicHelper.GetMemberValue(obj, memberName);
43             }
44 
45             return values;
46         }
47     }
48 }
49