.net 如何将Cookies集合转换为通用列表?轻易地
有人知道我如何将.net 如何将Cookies集合转换为通用列表?轻易地,.net,generics,.net-3.5,.net,Generics,.net 3.5,有人知道我如何将Request.Cookies转换为列表?以下操作不起作用,因为它引发了异常 List<HttpCookie> lstCookies = new List<HttpCookie>( Request.Cookies.Cast<HttpCookie>()); List=新列表( Request.Cookies.Cast()); 异常:无法将类型为“System.String”的对象强制转换为类型为“System.Web.HttpCook
Request.Cookies
转换为列表
?以下操作不起作用,因为它引发了异常
List<HttpCookie> lstCookies = new List<HttpCookie>(
Request.Cookies.Cast<HttpCookie>());
List=新列表(
Request.Cookies.Cast());
异常:无法将类型为“System.String”的对象强制转换为类型为“System.Web.HttpCookie”.Cookies.cast()代码>尝试将密钥集合强制转换为cookie集合。因此,出现错误是很正常的:)
这是一个名称->值集合,因此将其转换为列表并不好
我会试着把它转换成字典
例如:
Dictionary cookieCollection = new Dictionary<string, object>();
foreach(var key in Request.Cookies.GetAllKeys())
{
cookieCollection.Add(key, Request.Cookies.Item[key]);
}
由于Cookie继承自NameObjectCollectionBase,因此您可以使用该列表获取所有值并将其放入字典中
例如:
Dictionary cookieCollection = new Dictionary<string, object>();
foreach(var key in Request.Cookies.GetAllKeys())
{
cookieCollection.Add(key, Request.Cookies.Item[key]);
}
Dictionary-cookieCollection=new Dictionary();
foreach(请求中的var key.Cookies.GetAllKeys())
{
添加(key,Request.Cookies.Item[key]);
}
发生这种情况的原因是,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();
如果您确实想要一个没有键->值连接的直接列表
,那么您可以使用LINQ中的Select:
var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();
这个问题可能有点老了,但这里的答案并没有涵盖所有情况,因为正如@C.M.所指出的,可能有多个cookie具有相同的名称
因此,最简单的方法是使用for循环循环cookies集合:
var existingCookies = new List<HttpCookie>();
for (var i = 0; i < _httpContext.Request.Cookies.Count; i++)
{
existingCookies.Add(_httpContext.Request.Cookies[i]);
}
var existingCookies=new List();
对于(var i=0;i<\u httpContext.Request.Cookies.Count;i++)
{
existingCookies.Add(_httpContext.Request.Cookies[i]);
}
但随后您会丢失键->值连接:)@Snake,我同意您的观点,从性能角度来看,这不是最佳的,因为它会多次枚举集合,但如果您有几个元素,则可能不会太夸张。使用HttpCookieCollection的AllKeys成员可以保存强制转换。代码见我的答案。这帮助我解决了XmlSerializer序列化键而不是值的问题。My NameObjectCollectionBase子类需要重写GetEnumerator,因为返回此.BaseGetValues().GetEnumerator()如果Cookie是在不同的域中创建的,则code>IE可以发送具有相同名称的多个Cookie。如果发生这种情况,则上面的代码将丢失其中一个cookie。该代码仅获取具有相同名称的第一个cookie。