我有一个用查询字符串参数构建url的类,依此类推。该类有一个方法:Url()返回由类属性和另一个方法组成的完整url:UrlNew()允许传递谓词作为参数,用于替换其中一个属性的值,然后返回修改后的URL 。现在,我需要修改此函数以使用两个谓词的两个参数。我怎么做?我尝试将方法的参数修改为谓词列表,但我可能没有做正确的事情:
我的OLD UrlNew()方法如下所示:
public static string Url() (Action<LGUrlBuilder> predicate)
{
var instance = new LGUrlBuilder();
if (predicate != null) predicate(instance);
return instance.BuildUrl();
}
我的新UrlNew()方法如下所示:
public static string UrlNew(List<Action<LGUrlBuilder>> predicateList)
{
var instance = new LGUrlBuilder();
if (predicateList != null && predicateList.Count > 0)
{
foreach (Action<LGUrlBuilder> predicate in predicateList)
{
if (predicate != null) predicate(instance);
}
}
return instance.BuildUrl();
}
这个编译得很好但是当我运行它时,在ASPX中使用它会给我这个错误:
CS1660: Cannot convert lambda expression to type 'System.Collections.Generic.List<System.Action<public_site.Library.LG.LGUrlBuilder>>' because it is not a delegate type
我是C#初学者,我确信我做错了。任何建议都会有帮助。谢谢!
答案 0 :(得分:5)
不要修改功能本身。修改方法调用,如下所示:
UrlNew(x => { func1(x); func2(x); });
但是如果真的想要将任意数量的委托实例作为参数,请尝试修改它:
public static void UrlNew(params Action<LGUrlBuilder>[] list) {
// ... do what you're already doing in the second snippet ...
}
你可以这样称呼:
UrlNew(x => firstthing(), x => secondthing(x), thirdthing);
旁注:Action<T>
不称为谓词。谓词返回一个布尔值。
答案 1 :(得分:0)
如何使用接受2个参数的重载Action<T1,T2>
委托。
如果您希望使用谓词而不是需要布尔返回值,那么请改用Func<T1,T2,bool>
。