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

标签 c# asp.net-mvc linq lambda

我正在尝试制作我自己的扩展方法,它可以采用任意数量的 lambda 表达式,但每当我添加多个表达式时,它似乎就会窒息。

方法如下:

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;
}

这是成功调用它的标记:

<%: Html._RouteButton("details", "Health", "SystemDetails", m=>m.Id)%>

这是错误的标记:

<%: Html._RouteButton("details", "Health", "SystemDetails", m=>m.Id, m=>m.Status)%>

这里是错误:

The type arguments for method cannot be inferred from the usage. Try specifying the type arguments explicitly

感谢任何帮助。谢谢!

最佳答案

让我们简化一下:

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
    }
}

现在清楚你的程序失败的原因了吗?

在我的程序中,每次调用都尝试推断 R。在第一次调用中,R 被推断为同时是 int 和 string,因此推断失败,因为不存在既是 int 又是 string 的类型。在第二个中,R 被推断为 int 并且......又是 int!成功是因为 int 匹配所有边界。第三,R被推断为int和decimal,成功了,因为每个int都可以隐式转换为decimal,所以decimal是一个很好的推断。

Id 和 Status 可能是类型不兼容的属性。如果您想这样做,那么推断出的类型之一必须是最佳类型

请注意,C# 永远不会说“哦,我看到你推断了狗、猫和鱼的界限,所以我猜你指的是动物”。 C# 而是说“Dog、Cat 或 Fish 显然都不是最佳绑定(bind),所以我不知道你的意思;请明确说明”。

关于c# - 如何创建一个接受多个 lambda 表达式作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14880127/

相关文章:

c# - 如何使用 C# 和 ASP.net 连接 HP Quality Center

c# - 将字符串从 delphi dll 返回到 64 位的 C# 调用程序

java - 如何将 cookie 从 WebViewClient 保存到 URLConnection、浏览器或其他文件下载技术在 android 中

c# - 在 Html.Action 中指定 QueryString

c# - 内存中的 LINQ 性能

c# - 在字符串中查找匹配的 guid

c# - Blazor WebAssembly 401 未经授权,即使我已获得授权

c# - 请将 SQL 转换为 LINQ 或改进我的查询

javascript - 如何绕过模型 jquery 验证

c# - 按键获取字典列表中的所有值