C# 使用lambda for MVC helper传递列表时出现问题

C# 使用lambda for MVC helper传递列表时出现问题,c#,asp.net-mvc,asp.net-mvc-4,lambda,C#,Asp.net Mvc,Asp.net Mvc 4,Lambda,我正在开发一个MVC助手,我想在其中处理模型的每个属性 我创建了以下类: public class DataTableHtmlString<T> : HtmlString where T : class { public DataTableHtmlString(string value) : base(value) { } public DataTableHtmlString<T> Columns<TM>

我正在开发一个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;
    }
}
公共类DataTableHtmlString:HtmlString
T:在哪里上课
{
公共DataTableHtmlString(字符串值):
基数(值)
{
}
公共DataTableHtmlString列(表达式列)
其中TM:DataTableColumn
{
归还这个;
}
}
我的datacolumn类如下所示:

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

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

        }
    }
公共类DataTableColumn
{
内部字符串ColumnTitle{get;set;}
公共空白列(表达式列)
{
}
}
当我使用以下方式调用我的助手方法时:

@(Html.MyControls()
                .MyGrid<PersonModel>()
                .Columns(column =>
                {
                    column.Column(w => w.Name);
                })
)
@(Html.MyControls()
.MyGrid()
.列(列=>
{
column.column(w=>w.Name);
})
)
它给出了.Columns方法的错误,如下所示: “无法从用法中推断方法'DataTableHtmlString.Columns(Expression>)'的类型参数。请尝试显式指定类型参数。”

更新


我添加了
Columns
及其工作原理,但我已经提到了Columns方法,TM是DataTableColumn,T是类,它将在
MyGrid
中可用,所以为什么我需要再次定义?编译器应该从签名本身知道吗?

您需要在
Columns()
方法中定义泛型。您可能想用
DataTableColumn
DataTableColumn
替换TM泛型:

Html.MyControls()
.MyGrid()
.列(列=>
{
column.column(w=>w.Name);
})

谢谢@AxelWass的回复。这是工作,但为什么我需要这样做。我已经更新了帖子。你能查一下吗?这是因为TM不能从
column=>{column.column(w=>w.Name);}
推断出来,因为这里
column
不能推断出来。您不能通过对某个类调用的方法来推断该类,因为可能存在具有相同方法名称的其他类。因此无法应用自动推理,编译器需要一些帮助来了解
参数是什么,以及TM代表什么类。你可以看到更多关于C#类型推断的信息,它有点过时了,但我认为它无论如何都会让你大吃一惊。
Html.MyControls()
    .MyGrid<PersonModel>()
    .Columns<DataTableColumn<PersonModel>>(column =>
    {
        column.Column(w => w.Name);
    })