/// <summary> /// Returns the data dictionary that constains the description. /// </summary> /// <param name="descriptionId">The description id.</param> /// <returns></returns> public DataDictionary FindDataDictionary(NodeId descriptionId) { // check if the dictionary has already been loaded. foreach (DataDictionary dictionary in m_dictionaries.Values) { if (dictionary.Contains(descriptionId)) { return dictionary; } } // find the dictionary for the description. Browser browser = new Browser(this); browser.BrowseDirection = BrowseDirection.Inverse; browser.ReferenceTypeId = ReferenceTypeIds.HasComponent; browser.IncludeSubtypes = false; browser.NodeClassMask = 0; ReferenceDescriptionCollection references = browser.Browse(descriptionId); if (references.Count == 0) { throw ServiceResultException.Create(StatusCodes.BadNodeIdInvalid, "Description does not refer to a valid data dictionary."); } // load the dictionary. NodeId dictionaryId = ExpandedNodeId.ToNodeId(references[0].NodeId, m_namespaceUris); DataDictionary dictionaryToLoad = new DataDictionary(this); dictionaryToLoad.Load(references[0]); m_dictionaries[dictionaryId] = dictionaryToLoad; return dictionaryToLoad; }