/// <summary>
 /// Retruns the CimInstance of a given Infrastructure object
 /// </summary>
 /// <param name="source">can be null (in this case return value will be null)</param>
 /// <returns></returns>
 public static CimInstance AsCimInstance(this IInfrastructureObject source)
 {
     if (source == null)
     {
         return(null);
     }
     return(source.InnerCimInstance);
 }
        /// <summary>
        /// Set a property value
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        public static void SetProperty <T>(this IInfrastructureObject o, string name, T value)
        {
            if (o == null)
            {
                throw new ArgumentNullException(nameof(o));
            }

            o.InnerCimInstance.CimInstanceProperties[name].Value = value;
        }
        /// <summary>
        /// Set a property value
        /// </summary>
        /// <param name="o"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        public static void SetProperty(this IInfrastructureObject o, string name, IEnumerable <IInfrastructureObject> value)
        {
            if (value == null)
            {
                SetProperty <object>(o, name, null);
            }

            var instances = value.AsCimInstance().ToArray();

            SetProperty(o, name, instances);
        }
        /// <summary>
        /// Get an instance collection property value as wrappers
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        /// <param name="name"></param>
        /// <param name="outval"></param>
        public static void GetInfrastructureObjectProperty <T>(this IInfrastructureObject o, string name, out IEnumerable <T> outval) where T : class, IInfrastructureObject
        {
            IEnumerable <CimInstance> vals;

            GetProperty(o, name, out vals);

            if (vals == null)
            {
                outval = null;
                return;
            }
            outval = vals.Select(v => (T)o.InfrastuctureObjectScope.Mapper.Create(o.InfrastuctureObjectScope, v));
        }
        /// <summary>
        /// Get an instance property value as a wrapper
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="o"></param>
        /// <param name="name"></param>
        /// <param name="outval"></param>
        public static void GetInfrastructureObjectProperty <T>(this IInfrastructureObject o, string name, out T outval) where T : class, IInfrastructureObject
        {
            if (o == null)
            {
                throw new ArgumentNullException(nameof(o));
            }

            CimInstance val;

            GetProperty(o, name, out val);
            if (val == null)
            {
                outval = null;
                return;
            }
            outval = (T)o.InfrastuctureObjectScope.Mapper.Create(o.InfrastuctureObjectScope, val);
        }
 /// <summary>
 /// Set a property value
 /// </summary>
 /// <param name="o"></param>
 /// <param name="name"></param>
 /// <param name="value"></param>
 public static void SetProperty(this IInfrastructureObject o, string name, IInfrastructureObject value)
 {
     SetProperty(o, name, value?.InnerCimInstance);
 }