public bool IsCompatibleTemplate(Guid templateId, Type template) { // template Type must at least implement IItemWrapper if (!template.ImplementsInterface(typeof(IItemWrapper)) || !TemplateMap.ContainsKey(templateId)) { return(false); } if (template.IsInterface) { return(TemplateMap[templateId].Any(type => type.ImplementsInterface(template))); } else { // Get interface of template to check var templateType = TemplateMap.FirstOrDefault(p => p.Value.Contains(template)).Key; var interfaceType = InterfaceTemplateMap.FirstOrDefault(i => i.Value == templateType).Key; // Get interface of item to chack var interfaceToCheck = InterfaceTemplateMap.FirstOrDefault(i => i.Value == templateId).Key; return(interfaceToCheck == interfaceType || interfaceToCheck.ImplementsInterface(interfaceType)); } }