2017-02-03 5 views
1

Я разрабатываю помощник MVC, в котором я хочу обрабатывать каждое свойство Model.Проблема при передаче списка с использованием лямбда для помощника MVC

Я создал следующий класс:

public class DataTableHtmlString<T> : HtmlString 
    where T : class 
{ 
    public DataTableHtmlString(string value) : 
     base(value) 
    { 
    } 

    public DataTableHtmlString<T> Columns<TM>(Expression<Func<TM, T>> columns) 
     where TM : DataTableColumn<T> 
    { 
     return this; 
    } 
} 

Мой класс DataColumn выглядит следующим образом:

public class DataTableColumn<T> 
    { 
     internal string ColumnTitle { get; set; } 

     public void Column(Expression<Action<T>> column) 
     { 

     } 
    } 

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

@(Html.MyControls() 
       .MyGrid<PersonModel>() 
       .Columns(column => 
       { 
        column.Column(w => w.Name); 
       }) 
) 

Это дает ошибка для метода .Columns as: "Аргумент типа s для метода 'DataTableHtmlString.Columns (Expression>)' не может быть выведен из использования. Попробуйте явно указать аргументы типа. "

Update

Я добавил Columns<DataTableColumn<Jquery.DataTable.MVC5.Demo.Models.PersonModel>> и его работу, но я уже упоминал в методе Столбцы, ТМ DataTableColumn и Т класс, который будет доступен с MyGrid<PersonModel> так почему я должен снова определить? Compiler должны знать, от самой подписи я думаю

ответ

1

Вам нужно определить общий метод в Columns<TM>() вы, вероятно, хотите, чтобы заменить TM родовую с DataTableColumn<something> или DataTableColumn<PersonModel>:

Html.MyControls() 
    .MyGrid<PersonModel>() 
    .Columns<DataTableColumn<PersonModel>>(column => 
    { 
     column.Column(w => w.Name); 
    }) 
+0

Спасибо @AxelWass за ответ. Эта работа, но зачем мне это нужно. Я обновил сообщение. Можете ли вы задуматься? –

+1

Это потому, что TM не может быть выведено из 'column => {column.Column (w => w.Name); } ', потому что здесь' column' не может быть выведено. Вы не можете вывести класс методом, который вы вызываете в этом классе, потому что могут быть другие классы с тем же именем метода. Таким образом, автоматический вывод не может быть применен, компилятор нуждается в небольшой помощи в понимании того, что такое параметр 'column', и что представляет класс TM. – AxelWass

+0

[Здесь] (https://blogs.msdn.microsoft.com/ericlippert/2007/11/05/c-3-0-return-type-inference-does-not-work-on-method-groups/) вы можете увидеть некоторую дополнительную информацию о выводах типа C#, немного устаревшей, но я думаю, что она все равно может вас вскрикнуть. – AxelWass