В принципе, я хочу сделать очень простую вещь. Я хочу вызвать общий метод, где общее ограничение предоставляется интерфейсом - ICollectionEntity. Вот действие моего контроллера - это временное решение для целей разработки.Вызвать общий метод по типу, где тип - интерфейс
public class HomeController : BaseController
{
protected ICollectionsOrchestration collections;
public ActionResult Collection(string id)
{
var type = collections.GetType(id);
using (var uow = UnitOfWorkFactory.Create())
{
try
{
MethodInfo method = collections.GetType().GetMethods().FirstOrDefault(f =>
f.Name.Equals("Fetch") && f.GetParameters().Count() == 0);
MethodInfo generic = method.MakeGenericMethod(type);
var data = (IEnumerable<ICollectionEntity>) generic.Invoke(collections, null);
return View(data);
}
catch (Exception ex)
{
var msg = ex.Message;
}
}
return View();
}
}
Здесь находится интерфейс ICollectionsOrchestration и конкретный пример ICollectionEntity.
public interface ICollectionsOrchestration
{
Type GetType(string type);
IEnumerable<T> Fetch<T>() where T : ICollectionEntity;
}
public class Collection : ICollectionEntity { }
public partial class Language : Collection { }
Но на линии MethodInfo generic = method.MakeGenericMethod(type);
я получил исключение:
GenericArguments [0], 'Idea.Data.Collections.Language', на «System.Collections.Generic.IEnumerable`1 [T ] FetchT 'нарушает ограничение типа T.
Но когда я изменяю общее ограничение на Collection
, он просто работает. Итак, можете ли вы сказать мне, почему он работает с конкретным классом, но не с интерфейсом?
Можете ли вы сделать короткую, но полную программу, демонстрирующую проблему? –
Я пытаюсь что-то выяснить, дайте мне немного минут ... –
Я сделал попытку сделать скрипку, https://dotnetfiddle.net/nBMUBp, но она работает. Вы уверены, что ваша иерархия наследования такова, как вы показали? Можете ли вы заменить общий код кодом, специфичным для 'Language', и скомпилировать его? –