任何人都知道我可以轉換Request.Cookies
爲List<HttpCookie>
?以下內容不起作用,因爲它引發異常。如何將Cookies集合轉換爲通用列表?輕鬆
List<HttpCookie> lstCookies = new List<HttpCookie>(
Request.Cookies.Cast<HttpCookie>());
例外:無法轉換類型「System.String」的對象爲類型「System.Web.HttpCookie」
任何人都知道我可以轉換Request.Cookies
爲List<HttpCookie>
?以下內容不起作用,因爲它引發異常。如何將Cookies集合轉換爲通用列表?輕鬆
List<HttpCookie> lstCookies = new List<HttpCookie>(
Request.Cookies.Cast<HttpCookie>());
例外:無法轉換類型「System.String」的對象爲類型「System.Web.HttpCookie」
之所以出現這種情況是因爲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();
.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]);
}
如果你真的想要一個直List<HttpCookie>
無鍵 - >值連接,那麼你可以使用選擇在LINQ做到這一點:
var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
如果Cookie是在單獨的域中創建的,IE可以發送多個具有相同名稱的Cookie。如果發生這種情況,那麼上面的代碼會丟失其中一個cookie。 – 2012-12-26 15:15:12
的問題可能有點老了,但這裏的答案是沒有覆蓋所有的情況下,因爲@CM爲指出可以有多個具有相同名稱的Cookie。
所以最簡單的方法是循環Cookies集合有一個循環:
var existingCookies = new List<HttpCookie>();
for (var i = 0; i < _httpContext.Request.Cookies.Count; i++)
{
existingCookies.Add(_httpContext.Request.Cookies[i]);
}
但隨後丟失了密鑰 - >值連接:) – Snake 2010-05-27 16:26:31
@Snake,我同意你的看法,這是不是最佳從性能的角度來看,它會多次枚舉集合,但如果你有幾個元素,它可能不是很有戲劇性。 – 2010-05-27 16:28:02
使用HttpCookieCollection的AllKeys成員保存一個強制轉換。查看我的代碼答案。 – 2010-05-27 16:32:40