2016-01-20 5 views
-1

У меня есть метод, который динамически создает таблицу html в проекте MVC. В этой таблице может отображаться коллекция одного из четырех типов сущностей. Мне нужно передать типы сущностей в метод без кодирования метода для каждого типа.Передача списка общих типов в метод

Это мой метод декларации:

public static HtmlString Table(int rows, int columns, string[] headers, List<MyInterface> model) 
{ 
    //... 
} 

Это мое мнение, и как я называю мой вспомогательный метод:

@model List<MyModel> 

<some html> 

@OfficeUiHelper.Table(Model.Count, 5, new string[] { "First Name", "Last Name", "Username", "Company", "Role" }, Model) 

Это мой интерфейс:

public interface MyInterface 
{ 
} 

Это один из моих сущностей:

public partial class MyModel : MyInterface 
{ 
    // Properties 
} 

В заключении, когда я делаю это так, я получаю сообщение об ошибке:

Cannot convert from "System.Collections.Generic.List<MyModel>" to "System.Collections.Generic.List<MyInterface>" .

+1

Действительно ли метод 'Таблица' действительно нуждается в полном диапазоне опций, который предоставляет' List '? То есть добавление/удаление элементов или доступ к элементам по индексу? Или просто нужно «что-то», которое он может использовать в «foreach»? Если это последнее, возможно, вы можете изменить «Таблица», чтобы принять «IEnumerable ». – Corak

+0

Что касается * почему * вы получаете это исключение, прочитайте [ковариацию и контравариантность (часть 2)] (https://blogs.msdn.microsoft.com/ericlippert/2007/10/17/covariance-and-contravariance- in-c-part-two-array-covariance /) и другие части этой темы Эрика Липперта. В принципе, если у вас есть метод 'AddLions (List animals)' и ему будет разрешено передавать «Список », он может стать довольно грязным. – Corak

ответ

2

Вы можете добавить интерфейс, что все четыре класса реализацию, то вы можете передать список этого интерфейса вместо список типов object. Это избавит вас от многих бросков.

public partial class MyModel : MyInterface 
{ 
    // Properties 
} 

interface MyInterface {} 

public static HtmlString Table(int rows, int columns, string[] headers, List<MyInterface> model) 

Нет необходимости в генериках вообще. Кроме того, дженерики подразумевают, что могут быть переданы ВСЕ типы типов, которые разделяют условие, а не только несколько. Итак, что происходит, когда ваш пользователь метода прошел класс YourModel вместо MyMopdel.

+0

Если все эти классы полностью отличаются от того, что этот дизайн сломан в любом случае, и он должен рассмотреть возможность создания разных методов для каждого типа. – HimBromBeere

+0

Это работает. По кастингу мне не нужно, потому что у меня есть пользовательское свойство индексирования во всех моих моделях, поэтому я могу получить доступ к их свойствам по имени свойства. – LeonidasFett

+0

Вы имеете в виду отражение? Не очень хорошая идея ИМО, по крайней мере, если вы знаете, что можете избежать этого довольно элегантно и легко. – HimBromBeere