2017-04-25 68 views
1

如果這個問題出現「基本」,但是我沒有對代表做很多事情,並且我正在努力克服正確的語法 - 如果這是可能的話。可重複使用的代表

我用這樣的委託:

Func<KeyValuePair<string, PostMeta>, bool> filter = x => 
x.Value.Category == pageMeta.Value.Category && x.Key != pageMeta.Key; 

然而,我發現自己一次又一次地重新使用這個笨拙的一部分Func<KeyValuePair<string, PostMeta>, bool> - 感覺它應該像一個屬性的getter/setter,但我不確定。

下面是一些非工作的代碼來進一步證明:

宣言

delegate void PostFilter<Func<KeyValuePair<string, PostMeta>, bool>>(); 

用法:

PostFilter = x => x.Value.Category == pageMeta.Value.Category && x.Key != pageMeta.Key; 

任何意見讚賞。

回答

1

如果要定義它接受KeyValuePair<string, PostMeta>類型的一個參數,並返回bool(作爲你的第一個代碼片段暗示)的委託類型,使用此聲明:

delegate bool PostFilterDelegate(KeyValuePair<string, PostMeta> param); 

然後你可以使用的變量PostFilterDelegate類型:

不是定義委託
PostFilterDelegate PostFilter = x => 
    x.Value.Category == pageMeta.Value.Category && x.Key != pageMeta.Key; 
+0

感謝您的快速回答。不幸的是,這個答案改變了Func 的簽名,所以我不能再將這個一般地傳遞​​給其他方法而無需修改或接口。 –

1

其他,多一個選擇是使用using指令創建類型別名。以下是幾個示例:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using EqualsFunc = System.Func<int, int, bool>; 
using PostFilter = Func<System.Collections.Generic.KeyValuePair<string, PostMeta>, bool>; 
using MyPair = System.Collections.Generic.KeyValuePair<string,int>; 

namespace TypeAlias 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      EqualsFunc equals = (a, b) => a == b; 
      var result == equals(1, 2); //false 

      PostFilter filter = x => 
      x.Value.Category == pageMeta.Value.Category && x.Key != pageMeta.Key; 
      var filterResult = filter(new MyPair("key",5),10); 
     } 
    } 
}