2009-10-11 37 views
1

我有一个类与查询字符串参数等建立一个网址。该类有一个方法:Url()它返回由类属性和另一个方法组成的完整URL:UrlNew(),它允许传递谓词作为参数来替换其中一个属性的值,然后返回修改后的URL 。现在,我需要修改这个函数来使用两个谓词的参数。我怎么做?我试图修改方法的参数谓词的列表,但我可能不是在做正确的事情:在函数参数中使用多个谓词?

我的老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

只是一句话:Action是* not *谓词,因此您可能会考虑将参数名称更改为更合适的内容。 – Groo 2009-10-11 21:21:31

回答

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>不称为谓词。谓词返回一个布尔值。

+0

谢谢,我正要问具体如何实现,现在尝试... – 2009-10-11 17:05:53

+0

这完全工作!非常感谢。是的,我真的想在参数列表中有任意数量的实例。 – 2009-10-11 17:11:14

0

如何使用接受2参数的过载Action<T1,T2>委托。 如果您正在寻找使用谓词,而不是预期布尔返回值,则改为使用Func<T1,T2,bool>

+0

我有点像不受限于两个参数的副作用。 – 2009-10-12 10:31:04