/// <summary>
        /// Invoke the "special enumeration" in order to get collection of association classes (by filter)
        /// </summary>
        /// <param name="wsmanClient">the client to connect</param>
        /// <param name="EPR">the EPR representing the "main object"</param>
        /// <param name="resultClassName">the class name which will be returned from the enumeration</param>
        /// <param name="role">the role name of the "main class"</param>
        /// <returns>Collection of the result classes after executing the enumeration</returns>
        private static Collection<CimBaseReferencePair> EnumerateAssociationImpl(IWSManClient wsmanClient, CimReference EPR, Type resultClass, string role)
        {
            EnumerationOptions enumOptions = new EnumerationOptions();

            enumOptions.Filter = new AssociationFilter(
                EPR,
                resultClass.UnderlyingSystemType.Name,
                role,
                null); // This includeResultProperty is not supported by AMT

            Collection<CimBaseReferencePair> objCollection = CimBase.Enumerate(wsmanClient, enumOptions);

            return objCollection;
        }
        /// <summary>
        /// Return a single instance of association class (when it is known that a single instance exist)
        /// </summary>
        /// <param name="wsmanClient">the client to connect</param>
        /// <param name="EPR">the EPR representing the "main object"</param>
        /// <param name="resultClass">the class name which will be returned from the enumeration</param>
        /// <param name="role">the role name of the "main class"</param>
        /// <returns>The requested instance</returns>
        public static CimBase GetAssociation(IWSManClient wsmanClient, CimReference EPR, Type resultClass, string role)
        {
            Collection<CimBase> objCollection = EnumerateAssociations(wsmanClient, EPR, resultClass, role);

            if (objCollection.Count > 1)
                throw new AssociationTraversalException(GET_FAILURE_EXCEPTION);

            // If the collection is empty it might be that one of the properties is wrong
            // Or that no instances exist.
            if (objCollection.Count == 0)
                throw new AssociationTraversalException(NO_INSTANCES_EXCEPTION);

            return objCollection[0];
        }
        /// <summary>
        /// Invoke the "special enumeration" in order to get collection of classes (by filter)
        /// </summary>
        /// <param name="wsmanClient">the client to connect</param>
        /// <param name="EPR">the EPR representing the "main object"</param>
        /// <param name="resultClassName">the class name which will be returned from the enumeration</param>
        /// <param name="associationClassName">the association class name, this class define the relation between the EPR and the result classes</param>
        /// <param name="role">the role name of the "main class"</param>
        /// <param name="resultRole">the role name of the result class</param>
        /// <returns>Collection of the result classes after executing the enumeration</returns>
        private static Collection<CimBaseReferencePair> EnumerateAssociatedImpl(IWSManClient wsmanClient, CimReference EPR, Type resultClass, Type associationClass, string role, string resultRole)
        {
            EnumerationOptions enumOptions = new EnumerationOptions();

            enumOptions.Filter = new AssociatedFilter(
                EPR,
                (resultClass != null) ? resultClass.UnderlyingSystemType.Name : null, // Validate the resultClass property
                role,
                null, // The includeResultProperty is not supported by AMT
                (associationClass != null) ? associationClass.UnderlyingSystemType.Name : null, // Validate the associationClass property
                resultRole);

            Collection<CimBaseReferencePair> objCollection = CimBase.Enumerate(wsmanClient, enumOptions);

            return objCollection;
        }
 /// <summary>
 /// Return a single instance of association class (when it is known that a single instance exist)
 /// </summary>
 /// <param name="wsmanClient">the client to connect</param>
 /// <param name="EPR">the EPR representing the "main object"</param>
 /// <param name="resultClass">the class name which will be returned from the enumeration</param>
 /// <returns>The requested instance</returns>
 public static CimBase GetAssociation(IWSManClient wsmanClient, CimReference EPR, Type resultClass)
 {
     return GetAssociation(wsmanClient, EPR, resultClass, null);
 }
        /// <summary>
        /// Return collection of the associations classes 
        /// </summary>
        /// <param name="wsmanClient">the client to connect</param>
        /// <param name="EPR">the EPR representing the "main object"</param>
        /// <param name="role">the role of the association class</param>
        /// <param name="resultClassPropertiesList">list of properties and their values for getting just the relevant classes</param>
        /// <returns>Collection of the requested classes</returns>
        public static Collection<CimBase> EnumerateAssociations(IWSManClient wsmanClient, CimReference EPR, Type resultClass, string role, List<KeyValuePair<string, string>> resultClassPropertiesList)
        {
            // Validate the EPR as it is necessary field
            if (EPR == null)
                throw new AssociationTraversalException(REQUIRED_PARAMETER_MISSING_EXCEPTION);

            // Invoke the special enumeration
            Collection<CimBaseReferencePair> objCollection = EnumerateAssociationImpl(wsmanClient, EPR, resultClass, role);

            // If the collection is empty, no need to search for instances - return the collection
            if (objCollection.Count == 0)
                return GetCimBaseFromCollection(objCollection);

            return (resultClassPropertiesList != null) ? GetObjectsByResultPropertyList(objCollection, resultClassPropertiesList) : GetCimBaseFromCollection(objCollection);
        }
        /// <summary>
        /// Return collection of the associations classes 
        /// </summary>
        /// <param name="wsmanClient">the client to connect</param>
        /// <param name="EPR">the EPR representing the "main object"</param>
        /// <param name="role">the role of the association class</param>
        /// <returns>Collection of the requested classes</returns>
        public static Collection<CimBase> EnumerateAssociations(IWSManClient wsmanClient, CimReference EPR, Type resultClass, string role)
        {
            // Validate the EPR as it is necessary field
            if (EPR == null)
                throw new AssociationTraversalException(REQUIRED_PARAMETER_MISSING_EXCEPTION);

            // Invoke the special enumeration
            Collection<CimBaseReferencePair> objCollection = EnumerateAssociationImpl(wsmanClient, EPR, resultClass, role);

            Collection<CimBase> baseCollection = GetCimBaseFromCollection(objCollection);

            return baseCollection;
        }
 /// <summary>
 /// Return collection of the associations classes 
 /// </summary>
 /// <param name="wsmanClient">the client to connect</param>
 /// <param name="EPR">the EPR representing the "main object"</param>
 /// <param name="resultClass">the association class name which will be returned from the enumeration</param>
 /// <param name="resultClassPropertiesList">list of properties and their values for getting just the relevant classes</param>
 /// <returns>Collection of the requested classes</returns>
 public static Collection<CimBase> EnumerateAssociations(IWSManClient wsmanClient, CimReference EPR, Type resultClass, List<KeyValuePair<string, string>> resultClassPropertiesList)
 {
     return EnumerateAssociations(wsmanClient, EPR, resultClass, null, resultClassPropertiesList);
 }
 /// <summary>
 /// Return collection of the associations classes 
 /// </summary>
 /// <param name="wsmanClient">the client to connect</param>
 /// <param name="EPR">the EPR representing the "main object"</param>
 /// <param name="resultClass">the association class name which will be returned from the enumeration</param>
 /// <returns>Collection of the requested classes</returns>
 public static Collection<CimBase> EnumerateAssociations(IWSManClient wsmanClient, CimReference EPR, Type resultClass)
 {
     return EnumerateAssociations(wsmanClient, EPR, resultClass, (string)null);
 }