Beispiel #1
0
        /// <summary>
        /// Loads an object from the specified XML element.
        /// </summary>
        /// <param name="resolver">A custom <see cref="ObjectLoaderMemberResolutionHandler"/> which allows external
        /// code to optionally resolve deserialized member values.</param>
        /// <param name="type">The type of object to load.</param>
        /// <param name="xml">The XML element that contains the object data.</param>
        /// <param name="culture">The culture information to use when parsing values.</param>
        /// <param name="ignoreMissingMembers">A value indicating whether the object loader
        /// should ignore members which do not exist on the type.</param>
        /// <returns>The object that was loaded.</returns>
        public Object LoadObject(ObjectLoaderMemberResolutionHandler resolver, Type type, XElement xml, CultureInfo culture, Boolean ignoreMissingMembers = false)
        {
            Contract.Require(type, nameof(type));
            Contract.Require(xml, nameof(xml));
            Contract.Require(culture, nameof(culture));

            var state = new ObjectLoaderState(globalAliases, culture, resolver);

            state.IgnoreMissingMembers = ignoreMissingMembers;
            state.ParseClassAliases(null, type);

            var objectElement  = xml;
            var objectInstance = CreateObjectFromRootElement(state, type, objectElement);

            return(PopulateObject(state, objectInstance, objectElement));
        }
Beispiel #2
0
        /// <summary>
        /// Loads object definitions contained in the specified XML document.
        /// </summary>
        /// <typeparam name="T">The type of object to load.</typeparam>
        /// <param name="root">The root data element of the document that contains the object definitions to load.</param>
        /// <param name="aliases">The elements defining class aliases.</param>
        /// <param name="defaults">The elements defining class defaults.</param>
        /// <param name="name">The name of the type of object to load, which corresponds to the names of the elements in the XML file.</param>
        /// <param name="defaultClass">The name of the default class to apply to loaded objects.</param>
        public IEnumerable <T> LoadDefinitions <T>(XElement root,
                                                   IEnumerable <XElement> aliases, IEnumerable <XElement> defaults, String name, Type defaultClass) where T : DataObject
        {
            Contract.Require(root, nameof(root));
            Contract.Require(name, nameof(name));

            var cultureString = (String)root.Attribute("Culture");
            var culture       = String.IsNullOrWhiteSpace(cultureString) ? CultureInfo.InvariantCulture : new CultureInfo(cultureString);

            try
            {
                lockobj.EnterReadLock();

                var state = new ObjectLoaderState(globalAliases, culture);
                state.ParseClassAliases(aliases, defaultClass);
                state.ParseClassDefaults(defaults);

                var objectElements = root.Elements(name);
                var objectList     = new List <T>();

                foreach (var objectElement in objectElements)
                {
                    var objectInstance = (T)CreateObjectFromRootElement(state, typeof(T), objectElement);
                    PopulateObject(state, objectInstance, objectElement);
                    objectList.Add(objectInstance);
                }

                return(objectList);
            }
            finally
            {
                if (lockobj.IsReadLockHeld)
                {
                    lockobj.ExitReadLock();
                }
            }
        }