任何人都知道我可以转换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