public static bool TryGetName(this Link link, out string str) { // Защита от зацикливания if (!_linksWithNamesGatheringProcess.Add(link)) { str = "..."; return(true); } try { if (link != null) { if (link.Linker == Net.And) { str = SequenceHelpers.FormatSequence(link); return(true); } else if (link.IsGroup()) { str = LinkConverter.ToString(LinkConverter.ToList(link.Target)); return(true); } else if (link.IsChar()) { str = LinkConverter.ToChar(link).ToString(); return(true); } else if (link.TryGetSpecificName(out str)) { return(true); } if (link.Source == link || link.Linker == link || link.Target == link) { return(false); } if (link.Source.TryGetName(out string sourceName) && link.Linker.TryGetName(out string linkerName) && link.Target.TryGetName(out string targetName)) { var sb = new StringBuilder(); sb.Append(sourceName).Append(' ').Append(linkerName).Append(' ').Append(targetName); str = sb.ToString(); return(true); } } str = null; return(false); } finally { _linksWithNamesGatheringProcess.Remove(link); } }