using System.Linq;
using System.Reflection;
using System.Xml;
+using System.Xml.Serialization;
namespace System.Runtime.Serialization
{
{
internal CreateXmlSerializableDelegate GenerateCreateXmlSerializableDelegate()
{
- throw new NotImplementedException ();
+ return () => new XmlDataContractInterpreter (this).CreateXmlSerializable ();
+ }
+ }
+
+ internal class XmlDataContractInterpreter
+ {
+ XmlDataContract contract;
+
+ public XmlDataContractInterpreter (XmlDataContract contract)
+ {
+ this.contract = contract;
+ }
+
+ public IXmlSerializable CreateXmlSerializable ()
+ {
+ Type type = contract.UnderlyingType;
+ object value = null;
+ if (type.IsValueType)
+ value = FormatterServices.GetUninitializedObject (type);
+ else
+ value = GetConstructor ().Invoke (new object [0]);
+ return (IXmlSerializable) value;
+ }
+
+ ConstructorInfo GetConstructor ()
+ {
+ Type type = contract.UnderlyingType;
+
+ if (type.IsValueType)
+ return null;
+
+ ConstructorInfo ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Globals.EmptyTypeArray, null);
+ if (ctor == null)
+ throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.IXmlSerializableMustHaveDefaultConstructor, DataContract.GetClrTypeFullName(type))));
+
+ return ctor;
}
}
}