4435cbc8293b818c3dd1da3ce1d9665e0a821667
[mono.git] / mcs / class / referencesource / System.Data.Entity / System / Data / Objects / ProxyDataContractResolver.cs
1 //---------------------------------------------------------------------
2 // <copyright file="ProxyDataContractResolver.cs" company="Microsoft">
3 //      Copyright (c) Microsoft Corporation.  All rights reserved.
4 // </copyright>
5 //
6 // @owner       Microsoft
7 // @backupOwner Microsoft
8 //---------------------------------------------------------------------
9 using System;
10 using System.Collections.Generic;
11 using System.Linq;
12 using System.Text;
13 using System.Xml;
14 using System.Runtime.Serialization;
15
16 namespace System.Data.Objects
17 {
18     /// <summary>
19     /// A DataContractResolver that knows how to resolve proxy types created for persistent
20     /// ignorant classes to their base types. This is used with the DataContractSerializer.
21     /// </summary>
22     public class ProxyDataContractResolver : DataContractResolver
23     {
24         private XsdDataContractExporter _exporter = new XsdDataContractExporter();
25         
26         public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
27         {
28             EntityUtil.CheckStringArgument(typeName, "typeName");
29             EntityUtil.CheckStringArgument(typeNamespace, "typeNamespace");
30             EntityUtil.CheckArgumentNull(declaredType, "declaredType");
31             EntityUtil.CheckArgumentNull(knownTypeResolver, "knownTypeResolver");
32
33             return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType ,null);
34         }
35
36         public override bool TryResolveType(Type dataContractType, Type declaredType, DataContractResolver knownTypeResolver, out System.Xml.XmlDictionaryString typeName, out System.Xml.XmlDictionaryString typeNamespace)
37         {
38             EntityUtil.CheckArgumentNull(dataContractType, "dataContractType");
39             EntityUtil.CheckArgumentNull(declaredType, "declaredType");
40             EntityUtil.CheckArgumentNull(knownTypeResolver, "knownTypeResolver");
41
42             Type nonProxyType = ObjectContext.GetObjectType(dataContractType);
43             if (nonProxyType != dataContractType)
44             {
45                 // Type was a proxy type, so map the name to the non-proxy name
46                 XmlQualifiedName qualifiedName = _exporter.GetSchemaTypeName(nonProxyType);
47                 XmlDictionary dictionary = new XmlDictionary(2);
48                 typeName = new XmlDictionaryString(dictionary, qualifiedName.Name, 0);
49                 typeNamespace = new XmlDictionaryString(dictionary, qualifiedName.Namespace, 1);
50                 return true;
51             }
52             else 
53             {
54                 // Type was not a proxy type, so do the default
55                 return knownTypeResolver.TryResolveType(dataContractType, declaredType, null, out typeName, out typeNamespace);
56             } 
57         }
58     }
59 }