C# 使用lambda for MVC helper传递列表时出现问题
我正在开发一个MVC助手,我想在其中处理模型的每个属性 我创建了以下类: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>
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);
})