2009-12-30 24 views
0

我有一個方法(如下所示),我發現可以在其他地方的代碼中重用,如果我可以把它變成一個通用的方法,但我正在努力與語法,可以使用一點幫助:重寫類型的具體方法爲通用

樣品:

private List<IndexEntry> AddParentReferences(List<IndexEntry> listWithoutParents) 
     { 
      List<IndexEntry> listWithParents = new List<IndexEntry>(); 

      foreach (IndexEntry currentEntry in listWithoutParents) 
      { 
       if (currentEntry.SubEntries == null || currentEntry.SubEntries.Count < 1) 
       { 
        listWithParents.Add(currentEntry); 
        continue; 
       } 
       AddIndividualParentReference(currentEntry); 
       listWithParents.Add(currentEntry); 
      } 
      return listWithParents; 
     } 

正如你可以看到它是一個簡單的方法,該方法在IndexEntry類型的列表,並列舉了列表中添加層次結構中的父項的引用。我發現有類似的設計類型,也需要在各個點上添加這種參考。我想修改這段代碼來獲取一個List,並返回一個適當的List,其中T是傳入的類型。這看起來像是一種直接的寫法,但我想我可能在我的方法中缺少一個簡單的sytax問題定義。任何人都可以啓發我嗎?

由於提前,

史蒂夫

+0

你可以在AddIndividualParentReference方法上添加一些信息嗎?我沒看到它。 – 2009-12-30 15:16:23

+0

在聲明中的函數名稱之後添加:private列表 AddParentReferences (列表 listWithoutParents)----爲了方便閱讀,您可能需要將該名稱重構爲「TElement」。 – 2009-12-30 15:18:12

回答

5

當你的方法一般,你需要添加一個類型約束。如果你不這樣做,你不能訪問currentEntry.SubEntries,因爲編譯器不能推斷出T有這樣的屬性。因此,定義一個接口類型,因爲我已經做了下面,然後繼續像這樣:

List<T> AddParentReferences<T>(List<T> listWithoutParents) where T : IIndexEntry { 
    List<T> listWithParents = new List<T>(); 

    foreach (T currentEntry in listWithoutParents) { 
     if (currentEntry.SubEntries == null || currentEntry.SubEntries.Count < 1) { 
      listWithParents.Add(currentEntry); 
      continue; 
     } 
     AddIndividualParentReference(currentEntry); 
     listWithParents.Add(currentEntry); 
    } 
    return listWithParents; 
} 

這裏是最小的界面,你會需要做上述工作:

interface IIndexEntry { 
    IList<IIndexEntry> SubEntries; 
} 
+1

謝謝......這讓我去了我需要的地方。 – 2009-12-30 17:15:24

3

可以使通過在方法名稱後附加<T>來通用方法。

一個問題是,您需要T有一個SubEntries屬性。您可以通過限制T來實現接口(見@傑森的回答)類型的解決這個問題,或者通過傳遞謂詞告訴條目是否爲空:

private List<T> AddParentReferences<T>(
    List<T> listWithoutParents, 
    Func<T, bool> isEmpty) 
{ 
    List<T> listWithParents = new List<T>(); 
    foreach (T currentEntry in listWithoutParents) 
    { 
     if (isEmpty(currentEntry)) 
     { 
      listWithParents.Add(currentEntry); 
      continue; 
     } 
     AddIndividualParentReference(currentEntry); 
     listWithParents.Add(currentEntry); 
    } 
    return listWithParents; 
} 

用法:

AddParentReferences<IndexEntry>(
    indexEntries, 
    e => e.SubEntries == null || e.SubEntries.Count < 1); 
相關問題