我正在尝试制作我自己的扩展方法,它可以采用任意数量的 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/