private static IEnumerable <T> GetBlocks <T>(SvgElement elements) where T : Block { if (typeof(T) == typeof(BlockText)) { return(elements.Descendants().Where(e => e.ID != null && e.ID.Contains("#t=")) .Select(e => { return (new BlockText() { Text = Encoding.UTF8.GetString(Encoding.Default.GetBytes(e.ID.Substring(3))) } as T); })); } else if (typeof(T) == typeof(BlockMenu)) { var dictionaryMenu = new Dictionary <string, BlockMenu>(); var menus = elements.Descendants().Where(e => e.ID != null && (e.ID.Contains("#t=") || e.ID.Contains("default"))) .ToList(); foreach (var e in menus) { var nameMenu = e.Parents.Where(p => p.ID != null && regex.IsMatch(p.ID)).First(); BlockMenu blockMenu = null; if (!dictionaryMenu.ContainsKey(nameMenu.ID)) { blockMenu = new BlockMenu(); blockMenu.OptionList = new List <BlockMenuOption>(); blockMenu.MenuType = MenuType.Default; } else { blockMenu = dictionaryMenu[nameMenu.ID]; } if (e.Parent.ID.Contains("QuickReply")) { blockMenu.MenuType = MenuType.QuickReply; } if (e.Parent.ID.Contains("Title")) { blockMenu.Text = GetEncodedText(e.ID.Substring(3)); } else if (e.Parent.ID.Contains("option")) { var option = new BlockMenuOption(); option.Text = GetEncodedText(e.ID.Substring(3)); blockMenu.OptionList.Add(option); } else if (e.ID.Contains("default")) { var option = new BlockMenuOption(); option.Text = "efault"; blockMenu.OptionList.Add(option); } if (dictionaryMenu.ContainsKey(nameMenu.ID)) { dictionaryMenu.Remove(nameMenu.ID); } dictionaryMenu.Add(nameMenu.ID, blockMenu); } return(dictionaryMenu.Values.AsEnumerable() as IEnumerable <T>); } else if (typeof(T) == typeof(BlockImage)) { var imageList = new List <BlockImage>(); imageList.Add(new BlockImage()); return(imageList.AsEnumerable() as IEnumerable <T>); } return(null); }