2013-10-25 40 views
1

Im試圖概括一個函數,該函數應該填充列表<>或字典<>。首先下面不編譯:如何概括返回字典或列表的函數

T foo<T>() where T : ICollection, new() 
{ 
    T t = new T(); 

    t.Add(1, 1); 

    return t; 
} 

錯誤1「T」不包含「添加」的定義和沒有擴展方法「添加」接受類型「T」的第一個參數可以發現(你是否錯過了使用指令或程序集引用?)

其次,假設這是否會編譯出來,怎麼可能將「添加」擴展?如果事情是可能的

+7

你如何*實際*得到鍵和值?如果你填寫一個清單,你會丟棄鍵還是值?或者用鍵/值對填充它?提供一個序列並允許調用者調用「ToDictionary」或「ToList」不是更簡單嗎?目前這個問題太模糊,不能回答,說實話。 –

+4

你不能使用'Add',因爲它不是'ICollection'接口的一部分。 –

回答

0

我想出了這個,不是最優雅的解決方案不知道如果我想借此生產

t.Add(1, 1) // for dictionaries 
and t.Add(1) // for Lists 

將是巨大的。 它從使用Func <>傳入的查詢中讀取SQL Server表,並且傳入的Action對象作爲參數用於將對象添加到集合。

public C Read<C, T>(Func<SqlConnection, SqlDataReader> func, Action<C, T> a) 
    where C : ICollection, new() 
    where T : EntityBase, new() 
{ 
    C objects = new C(); 

    using (SqlConnection connection = GetConnection()) 
    { 
     using (SqlDataReader reader = func(connection)) 
     { 
      while (reader.Read()) 
      { 
       T obj = new T(); 
       obj.PopulateFromReader(reader); 
       a(objects, obj); 
      } 
     } 
    } 

    return objects; 
} 

這樣調用:

 Dictionary<Guid, DeliveryMoment> dic = _dalBO.Read<Dictionary<Guid, DeliveryMoment>, DeliveryMoment>(connection => { return CmdFactory.ReadDeliveryMoments(connection); }, (d, o) => { d.Add(o.DeliveryMomentId, o); }); 

你覺得呢?太陰暗或可以接受?

0
static T Temp<T>(params object[] obj) where T:ICollection, new() 
    { 
     T s = new T(); 
     //TODO: validation for input values 
     if (s is IDictionary) 
     { 
      ((IDictionary) s).Add(obj[0], obj[1]); 
     } 
     else if (s is IList) 
     { 
      ((IList)s).Add(obj[0]); 
     } 

     return s; 
    } 
0

也許像下面

public static void AddToCollection(this ICollection col, object value) 
    { 
     if (col is IDictionary) 
     { 
      ((IDictionary)col).Add(value, value); 
     } 
     else if(col is IList) 
     { 
      ((IList)col).Add(value); 
     } 
    } 

,然後擴展方法代替

t.Add(1, 1); 

t.AddToCollection(1); 
+0

如果你的字典每次都添加同一個實例作爲鍵和值,那麼你只是使用了錯誤的數據結構,而*那*是他的問題;他應該只是使用類似'HashSet'的東西,然後有一種方法使用通用簽名。 – Servy

+0

我假設他知道他想要什麼並回答他的問題。在初始設置後可能需要字典行爲。 – snacky

+0

然後,要做的適當的事情就是讓這個函數返回一個列表或'IEnumerable',並讓調用者用它來做他們想要的,或者填充一個列表或一個字典。 – Servy