2011-12-27 5 views
1

Dans mon fichier Global.asax j'ai créé et la liste de tableau qui contient un objet de type anonymecasting type anonyme lance erreur de casting

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

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

maintenant dans mon fichier cs j'ai une fonction de coulée qui va comme ceci

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

maintenant quand je lance la boucle pour itérer les données et extraire les données dans le jeu de données que je reçois une erreur voir le code

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); 
    } 
erreur

est

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

s'il vous plaît aidez-moi .. J'ai essayé toutes les méthodes que j'ai trouvé sur stackoverflow ou toute autre source .....

thnx

+0

Avez-vous lu le message? Vos types sont erronés. – SLaks

+0

Quelle est la signature/code de votre méthode 'Cast()'? –

+0

@SLaks Ce n'est pas le problème ... exécutez le code et vérifiez-le vous-même – 1Mayur

Répondre

6

Ne pas utiliser type anonyme - utilisez le type réel dont vous avez besoin. Les types anonymes ne peuvent être utilisés que dans une méthode - ils ne peuvent pas être transmis en tant que paramètres ou types de retour et ne conviennent pas à la sérialisation en général.

En outre, vous ne devez pas utiliser ArrayList - il n'est pas de type sécurisé. Utilisez une collection générique comme List<T> à la place.

+0

ohk je vais essayer de ne pas l'utiliser..mais je veux vraiment savoir la solution à ce problème !!!! – 1Mayur

0

Ils ne sont pas compatibles. Le message d'erreur donne l'erreur. L'un est de type anonyme avec les propriétés int et DateTime. La seconde a string et string comme propriétés.

Vous ne pouvez diffuser que le type réel, ou une classe de base, et les types anonymes n'ont pas de classe de base autre que object, c'est donc la seule chose à laquelle vous pouvez les attribuer.

C'est probablement ce que vous voulez:

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

Ou comme le dit Oded, utilisez un type réel.

+0

Davy le cas que vous parlez n'est pas ce que l'erreur exacte est ... s'il vous plaît exécuter le code et vérifier – 1Mayur

+0

Peut trouver item.logTime thats ce qu'il erreur est tout – 1Mayur

0

Celui démontré dans votre code n'est pas un exemple idéal pour le type anonyme. Je préférerais utiliser un type anonyme pour une portée de niveau méthode, de préférence avec un peu de Linq.

Bien que je sois d'accord, il est difficile de créer une classe/un modèle pour chaque combinaison d'objets. Ainsi, dans votre cas, vous pouvez envisager d'utiliser une classe Pair générique, juste pour stocker DateTime et int dans un objet apparié. Lisez here.

Ainsi, votre collection deviendrait:

(List<Pair<int,DateTime>>Application["userRecordsCountList"]).Add(new Pair<int,DateTime>(12, DateTime.Now));