2015-02-04 2 views
0

В принципе, я хочу сделать очень простую вещь. Я хочу вызвать общий метод, где общее ограничение предоставляется интерфейсом - 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, он просто работает. Итак, можете ли вы сказать мне, почему он работает с конкретным классом, но не с интерфейсом?

+1

Можете ли вы сделать короткую, но полную программу, демонстрирующую проблему? –

+0

Я пытаюсь что-то выяснить, дайте мне немного минут ... –

+0

Я сделал попытку сделать скрипку, https://dotnetfiddle.net/nBMUBp, но она работает. Вы уверены, что ваша иерархия наследования такова, как вы показали? Можете ли вы заменить общий код кодом, специфичным для 'Language', и скомпилировать его? –

ответ

0

Ahh, у меня было 2 интерфейса ICollectionEntity каждый из них в другом проекте внутри решения и в HomeController, который я использовал для обоих пространств имен проектов. Спасибо за советы.

Смежные вопросы