private T GetPermission(bool isFirst, int nodeID, int realNodeID, NodeItemCollection nodes) { T set; if (isFirst == false) { if (m_Cached.TryGetValue(realNodeID, out set)) { return(set); } } if (true == this.TryGetValue(nodeID, out set)) { if (set.NodeID != realNodeID) { T clone = (T)set.Clone(); clone.RealNodeID = realNodeID; if (false == m_Cached.ContainsKey(realNodeID)) { lock (m_Cached) { if (false == m_Cached.ContainsKey(realNodeID)) { m_Cached.Add(realNodeID, clone); } } } return(clone); } return(set); } if (nodeID != 0) { NodeItem nodeItem = nodes.GetValue(nodeID); if (nodeItem != null) { T t = GetPermission(false, nodeItem.ParentID, realNodeID, nodes); return(t); } } if (nodeID == 0) { T t = new T(); t.RealNodeID = realNodeID; return(t); } return(default(T)); }