2010-05-27 136 views
7

任何人都知道我可以轉換Request.CookiesList<HttpCookie>?以下內容不起作用,因爲它引發異常。如何將Cookies集合轉換爲通用列表?輕鬆

List<HttpCookie> lstCookies = new List<HttpCookie>(
    Request.Cookies.Cast<HttpCookie>()); 

例外:無法轉換類型「System.String」的對象爲類型「System.Web.HttpCookie」

回答

9

之所以出現這種情況是因爲NameObjectCollectionBase類型Request.Cookies來自收集的鑰匙,而不是在枚舉值派生。所以,當你列舉在Request.Cookies收集你所得到的鍵:

public virtual IEnumerator GetEnumerator() 
{ 
    return new NameObjectKeysEnumerator(this); 
} 

這意味着,下面的工作:

string[] keys = Request.Cookies.Cast<string>().ToArray(); 

我想你可以嘗試都可能被視爲醜陋,但會以下工作:

List<HttpCookie> lstCookies = Request.Cookies.Keys.Cast<string>() 
    .Select(x => Request.Cookies[x]).ToList(); 

UPDATE:

正如指出的@喬恩貝內迪克託在評論部分和his answer使用AllKeys屬性是更理想的,因爲它節省了轉換:

List<HttpCookie> lstCookies = Request.Cookies.AllKeys 
    .Select(x => Request.Cookies[x]).ToList(); 
+0

但隨後丟失了密鑰 - >值連接:) – Snake 2010-05-27 16:26:31

+0

@Snake,我同意你的看法,這是不是最佳從性能的角度來看,它會多次枚舉集合,但如果你有幾個元素,它可能不是很有戲劇性。 – 2010-05-27 16:28:02

+1

使用HttpCookieCollection的AllKeys成員保存一個強制轉換。查看我的代碼答案。 – 2010-05-27 16:32:40

2

.Cookies.Cast<HttpCookie>();嘗試密鑰集合投射到餅乾的集合。所以,你得到一個錯誤:)

它的名字是正常的 - >收藏價值,所以鑄造到一個列表不會是好的。

我會嘗試將其轉換爲一個字典。

例如:

由於Cookie自NameObjectCollectionBase繼承你可以GetAllKeys(),並使用該列表來獲取所有的值,並把它們放在一個字典。

例如:

Dictionary cookieCollection = new Dictionary<string, object>(); 

foreach(var key in Request.Cookies.GetAllKeys()) 
{ 
    cookieCollection.Add(key, Request.Cookies.Item[key]); 
} 
5

如果你真的想要一個直List<HttpCookie>無鍵 - >值連接,那麼你可以使用選擇在LINQ做到這一點:

var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList(); 
+0

如果Cookie是在單獨的域中創建的,IE可以發送多個具有相同名稱的Cookie。如果發生這種情況,那麼上面的代碼會丟失其中一個cookie。 – 2012-12-26 15:15:12

0

的問題可能有點老了,但這裏的答案是沒有覆蓋所有的情況下,因爲@CM爲指出可以有多個具有相同名稱的Cookie。

所以最簡單的方法是循環Cookies集合有一個循環:

var existingCookies = new List<HttpCookie>(); 

for (var i = 0; i < _httpContext.Request.Cookies.Count; i++) 
{ 
    existingCookies.Add(_httpContext.Request.Cookies[i]); 
} 
相關問題