2009-10-11 65 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