Кастинг Анонимный тип выдает ошибку приведения - PullRequest
1 голос
/ 27 декабря 2011

В моем файле Global.asax я создал и список массивов, который содержит объект анонимного типа

Application["userRecordsCountList"] = new ArrayList();

((System.Collections.ArrayList)Application["userRecordsCountList"]).Add(new { userCount = 12, logTime = DateTime.Now });

теперь в моем файле cs есть функция приведения, которая выглядит следующим образом

T Cast<T>(object obj, T type)
{
    return (T)obj;
}

теперь, когда я запускаю цикл для итерации данных и извлечения данных из набора данных, я получаю ошибку см код

ArrayList countRecord = new ArrayList((System.Collections.ArrayList)Application["userRecordsCountList"]);

foreach (var item in countRecord)
    {
        dr = dt.NewRow();
        var record = Cast(item, new { userCount = "", logTime = "" });
        dr["Time"] = record.logTime;
        dr["Users"] = record.userCount;
        dt.Rows.Add(dr);
    }

ошибка

Unable to cast object of type '<>f__AnonymousType0`2[System.Int32,System.DateTime]' to type '<>f__AnonymousType0`2[System.String,System.String]'.

, пожалуйста, помогите мне .. Я попробовал каждый метод, который я нашел в stackoverflow или любых других источниках .....

Thnx

Ответы [ 3 ]

6 голосов
/ 27 декабря 2011

Не используйте анонимный тип - используйте нужный вам тип.Анонимные типы могут использоваться только внутри метода - они не могут быть переданы в качестве параметров или возвращаемых типов и вообще не подходят для сериализации.

Кроме того, вы не должны использовать ArrayList - этоне тип безопасно.Вместо этого используйте общую коллекцию, например List<T>.

0 голосов
/ 27 декабря 2011

Показанный в вашем коде не идеальный пример для анонимного типа.Я предпочел бы использовать анонимный тип для области действия уровня метода, предпочтительно с некоторыми Linq.

Хотя я согласен, что создание класса / модели для каждой комбинации объектов затруднительноТаким образом, в вашем случае вы можете рассмотреть возможность использования универсального класса Pair, просто для хранения DateTime и int в парном объекте.Прочитайте здесь .

Итак, ваша коллекция станет:

(List<Pair<int,DateTime>>Application["userRecordsCountList"]).Add(new Pair<int,DateTime>(12, DateTime.Now)); 
0 голосов
/ 27 декабря 2011

Они не совместимые типы.Сообщение об ошибке дает ошибку.Один из них - анонимный тип со свойствами int и DateTime.Второй имеет string и string в качестве свойств.

Вы можете приводить только к фактическому типу или базовому классу, а анонимные типы не имеют базового класса, кроме object, поэтомуэто единственное, к чему вы можете привести их.

Это, вероятно, то, что вы хотите:

    dr = dt.NewRow();
    dr["Time"] = item.logTime.ToString();
    dr["Users"] = item.userCount.ToString();
    dt.Rows.Add(dr);

Или, как говорит Одед, используйте реальный тип.

...