【问题标题】:Issue while passing list using lambda for MVC helper使用 lambda 为 MVC 帮助程序传递列表时出现问题
【发布时间】:2017-02-03 20:52:51
【问题描述】:

我正在开发一个 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;
    }
}

我的数据列类如下所示:

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 方法的错误如下: "无法从用法中推断方法 'DataTableHtmlString.Columns(Expression>)' 的类型参数。请尝试显式指定类型参数。"

更新

我添加了Columns&lt;DataTableColumn&lt;Jquery.DataTable.MVC5.Demo.Models.PersonModel&gt;&gt; 及其工作,但我已经提到 Columns 方法,TM 是 DataTableColumn,T 是类,MyGrid&lt;PersonModel&gt; 可以使用它,为什么我需要再次定义?我认为编译器应该从签名本身知道?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 lambda


    【解决方案1】:

    您需要在方法Columns&lt;TM&gt;() 中定义泛型,您可能想用DataTableColumn&lt;something&gt;DataTableColumn&lt;PersonModel&gt; 替换TM 泛型:

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

    【讨论】:

    • 感谢@AxelWass 的回复。这项工作,但为什么我需要这样做。我已经更新了帖子。你能调查一下吗?
    • 这是因为无法从column =&gt;{ column.Column(w =&gt; w.Name); }推断TM,因为这里无法推断column。您不能通过在该类上调用的方法来推断该类,因为可能存在具有相同方法名称的其他类。所以无法应用自动推理,编译器需要一点帮助来了解column参数是什么,以及TM代表什么类。
    • Here 你可以看到一些关于 C# 类型推断的更多信息,它有点过时了,但我认为它无论如何都会让你大吃一惊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多