public IViewComponentResult Invoke(FilterViewModel model) { Type rendererType = null; if (_renderersMap.ContainsId(model.PropertyId)) rendererType = _renderersMap.GetFilterForProperty(model.PropertyId); else if (_renderersMap.ContainsType(model.PropertyType)) rendererType = _renderersMap.GetFilterForType(model.PropertyType); else return new ContentViewComponentResult($"Cannot render filter for property {model.PropertyName}"); var renderer = (IFilterRenderer)_renderersMap.GetFilterFactory(rendererType)(); var expectedModelType = rendererType.GetInterfaces() .Single(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IFilterRenderer<>)) .GetGenericArguments()[0]; if(expectedModelType != model.GetType()) throw new Exception($"Renderer '{rendererType.Name}' was expecting view model of type '{expectedModelType.Name}', but received '{model.GetType().Name}'"); var result = renderer.Render(model); if (result is ViewViewComponentResult viewResult) result = View(viewResult.ViewName, model); return result; }