public static IDiscriminatorPolicy GetDiscriminatorPolicy(DiscriminatorType policyType)
 {
     switch (policyType)
     {
         case DiscriminatorType.Attribute:
             return new AttributeDiscriminatorPolicy();
             break;
         case DiscriminatorType.Node:
             return new NodeDiscriminatorPolicy();
             break;
         default:
             throw new Exception("Unable to determine the policy");
     }
 }
        public static object Deserialize(string xml, DiscriminatorType discriminatorType = DiscriminatorType.Attribute)
        {
            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml(xml);

            // read "discriminator" and infer the real type
            var discriminatorPolicy = DiscriminatotyPolicyFactory.GetDiscriminatorPolicy(discriminatorType);

            // now we know the real type based on the discriminator to deserialize
            var serializer = new XmlSerializer(discriminatorPolicy.RetrieveRealType(xmlDocument));

            using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(xml)))
            {
                return serializer.Deserialize(stream);
            }
        }
        public static string Serialize(object info, DiscriminatorType discriminatorType = DiscriminatorType.Attribute)
        {
            var serializer = new XmlSerializer(info.GetType());
            using (var stream = new MemoryStream())
            {
                // Serialize
                serializer.Serialize(stream, info);
                stream.Position = 0;

                // Open serialization output
                var xmlDocument = new XmlDocument();
                xmlDocument.Load(stream);

                // Add a "discriminador" based on the real type, to use it during deserialization
                var discriminatorPolicy = DiscriminatotyPolicyFactory.GetDiscriminatorPolicy(discriminatorType);
                discriminatorPolicy.CreateDiscriminator(info, xmlDocument);

                // return the xml with the discriminator
                return xmlDocument.OuterXml;
            }
        }
 // ctor is private so you can't create an invalid instance
 private RustyEnum(DiscriminatorType type, object value)
 {
     Discriminator = type;
     Value         = value;
 }