Любой знает, как я могу преобразовать Request.Cookies
в a List<HttpCookie>
? Следующее не работало, поскольку оно выдает исключение.
List<HttpCookie> lstCookies = new List<HttpCookie>(
Request.Cookies.Cast<HttpCookie>());
Исключение: Не мог бросить объект типа 'Система. Строка' для ввода 'Системы. Сеть. 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:
Как указал @Jon Benedicto в разделе комментариев и в его ответе использование свойства AllKeys
является более оптимальным, так как сохраняет каст:
List<HttpCookie> lstCookies = Request.Cookies.AllKeys
.Select(x => Request.Cookies[x]).ToList();
.Cookies.Cast
пытается преобразовать коллекцию ключей в коллекцию файлов cookie. Так что нормально, что вы получаете сообщение об ошибке :)
Это коллекция name -> value, поэтому приведение к списку не годится.
Я бы попробовал преобразовать его в словарь.
Например:
Поскольку файлы cookie наследуются от NameObjectCollectionBase, вы можете GetAllKeys () и использовать этот список, чтобы получить все значения и поместить их в Словарь.
Например:
Dictionary cookieCollection = new Dictionary<string, object>();
foreach(var key in Request.Cookies.GetAllKeys())
{
cookieCollection.Add(key, Request.Cookies.Item[key]);
}
Если вам действительно нужен прямой List
без соединения ключ-> значение, то для этого можно использовать Select в LINQ:
var cookies = Request.Cookies.AllKeys.Select(x => Request.Cookies[x]).ToList();