如何创建一个接受多个lambda表达式作为参数的方法?

N-a*_*ate 4 c# linq asp.net-mvc lambda

我正在尝试创建自己的可以接受任意数量的lambda表达式的Extension方法,但是当我添加多个表达式时,它似乎会窒息.

这是方法:

public static MvcHtmlString _RouteButton<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, string label, string controller, string action, params Expression<Func<TModel, TProperty>>[] parameters)
{
   var test = parameters;
   return MvcHtmlString.Empty;
}
Run Code Online (Sandbox Code Playgroud)

这是成功调用它的标记:

<%: Html._RouteButton("details", "Health", "SystemDetails", m=>m.Id)%>
Run Code Online (Sandbox Code Playgroud)

这是错误的标记:

<%: Html._RouteButton("details", "Health", "SystemDetails", m=>m.Id, m=>m.Status)%>
Run Code Online (Sandbox Code Playgroud)

这是错误:

无法从用法中推断出方法的类型参数.尝试显式指定类型参数

任何帮助表示赞赏.谢谢!

Eri*_*ert 8

让我们简化一下:

using System;
class P
{
    static void M<R>(params Func<R>[] p) {}
    static void N(int i, string s, decimal m)
    {
        M(()=>i, ()=>s); // fails
        M(()=>i, ()=>s.Length); // succeeds
        M(()=>i, ()=>m); // succeeds
    }
}
Run Code Online (Sandbox Code Playgroud)

现在很清楚为什么你的程序失败了?

在我的程序中,每次调用都会尝试推断R.在第一次调用中,R被推断为int和string,因此推理失败,因为没有int和string都是类型.在第二个,R被推断为int和... int再次!这是成功的,因为int匹配所有边界.在第三个中,R被推断为int和decimal,这是成功的,因为每个int都可以隐式转换为decimal,因此decimal是一个很好的推理.

Id和Status可能是具有不兼容类型的属性.如果要执行此操作,则推断的其中一种类型必须是最佳类型.

请注意,C#从不说"哦,我看到你推断出狗,猫和鱼的界限,所以我猜你的意思是动物".C#反而说"狗,猫或鱼都不是最好的约束,所以我不知道你的意思;请明确说明".

  • @Nathaniel:这是一个编译时间限制,而不是运行时错误.它与编组无关.以这种方式看待它.当你有一个方法`M <T>`并且你调用它时,你需要*来给出一个类型参数.你需要*说'M <int>`,就像你需要*在制作一个新列表时说'List <int>`一样.它必须是**的列表*.该方法必须是**的方法*.现在,作为礼貌,如果省略`<int>`,编译器将尝试猜测你的意思.如果编译器无法猜测,那么它会告诉你. (2认同)