54 lines
1.4 KiB
C#
54 lines
1.4 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
using System.Reflection;
|
||
|
using System.Xml;
|
||
|
using System.Xml.Serialization;
|
||
|
|
||
|
namespace System.Runtime.Serialization
|
||
|
{
|
||
|
internal partial class XmlDataContract
|
||
|
{
|
||
|
internal CreateXmlSerializableDelegate GenerateCreateXmlSerializableDelegate()
|
||
|
{
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|