/// <summary> /// Get the list of value list items for the specified property def id. (for multiselect lookups) /// </summary> /// <param name="objVerEx">The child/owned object.</param> /// <param name="propDefId">The property definition id.</param> /// <returns>List of value list item objects if available</returns> /// <remarks>If one or more value list items cannot be loaded (e.g. permissions or ID does not exist) then they will be skipped in the returned collection.</remarks> /// <exception cref="ArgumentException">Thrown if <paramref name="propDefId"/> does not point to a suitable property definition.</exception> public static List <ValueListItem> GetPropertyAsValueListItems( this ObjVerEx objVerEx, int propDefId ) { // Sanity. if (null == objVerEx) { throw new ArgumentNullException(nameof(objVerEx)); } // Validity of the property def id if (0 > propDefId) { throw new ArgumentOutOfRangeException( nameof(propDefId), "Property Ids must be greater than -1; ensure that your property alias was resolved." ); } // Get the value list id of the property def PropertyDef propDef = objVerEx .Vault .PropertyDefOperations .GetPropertyDef(propDefId); // Exception if property was not found if (null == propDef) { throw new ArgumentException( $"The property could not be found.", nameof(propDefId) ); } // Does this have an owning type? if (false == propDef.BasedOnValueList || 0 > propDef.ValueList) { throw new ArgumentException( $"The property \"{propDef.Name}\" is not based on a value list.", nameof(propDefId) ); } // Does this have an owning type? if ((int)MFDataType.MFDatatypeMultiSelectLookup != (int)propDef.DataType) { throw new ArgumentException( $"The property \"{propDef.Name}\" is no multi select lookup property.", nameof(propDefId) ); } // Get the lookup elements and initialize result list IEnumerable <Lookup> lookups = objVerEx.GetLookupsFromProperty(propDefId); List <ValueListItem> listResults = new List <ValueListItem>(); VaultValueListItemOperations vliOps = objVerEx.Vault.ValueListItemOperations; // Loop through the lookup elements foreach (Lookup lookup in lookups) { try { listResults.Add( vliOps.GetValueListItemByID(propDef.ValueList, lookup.Item) ); } catch { // If we cannot load the value list item then we can skip this item. // This would only happen if the lookup points to an item that no longer // exists. } } // return the list with the value list items for the multiselect lookup entries return(listResults); }