2009-11-21 6 views
8

Ce qui suit est conforme mais au moment de l'exécution déclenche une exception. Ce que j'essaye de faire est de lancer une classe PersonWithAge à une classe de Person. Comment est-ce que je fais ceci et quel est le travail autour?Cast/Convert IEnumerable <T> à IEnumerable <U>?

class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

class PersonWithAge 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     IEnumerable<PersonWithAge> pwa = new List<PersonWithAge> 
     { 
      new PersonWithAge {Id = 1, Name = "name1", Age = 23}, 
      new PersonWithAge {Id = 2, Name = "name2", Age = 32} 
     }; 

     IEnumerable<Person> p = pwa.Cast<Person>(); 

     foreach (var i in p) 
     { 
      Console.WriteLine(i.Name); 
     } 
    } 
} 

EDIT: Par ailleurs PersonWithAge contiendra toujours les mêmes propriétés que personne plus un couple plus.

EDIT 2 Désolé les gars, mais j'aurais dû faire un peu plus clair, disons que j'ai deux vues db dans une base de données qui contient les mêmes colonnes, mais la vue 2 contient 1 champ supplémentaire. Mes entités de vue de modèle sont générées par un outil qui imite les vues de la base de données. J'ai une vue partielle MVC qui hérite de l'une des entités de classe mais j'ai plus d'un moyen de saisir des données ...

Je ne sais pas si cela aide, mais cela signifie que je ne peux pas faire en sorte que personWithAge hérite de la personne.

Répondre

16

Vous ne pouvez pas lancer parce qu'ils sont différents types. Vous avez deux choix:

1) Changez la classe pour que PersonWithAge hérite de la personne.

class PersonWithAge : Person 
{ 
     public int Age { get; set; } 
} 

2) Créer de nouveaux objets:

IEnumerable<Person> p = pwa.Select(p => new Person { Id = p.Id, Name = p.Name }); 
+1

La manière choisie peut être la voie en avant, cependant je m'attendrais à une pénalité car ceci peut ne pas être un moyen maigre. – Rippo

6

Utilisation Select au lieu de Cast afin d'indiquer comment effectuer la conversion d'un type à l'autre:

IEnumerable<Person> p = pwa.Select(x => new Person { Id = x.Id, Name = x.Name }); 

également que PersonWithAge contiendra toujours les mêmes propriétés que Person plus un couple plus il serait préférable pour l'avoir hérité de Person.

+0

La voie sera peut-être la voie à suivre, mais je me attends à une pénalité que cela ne peut être un moyen maigre. – Rippo

1

vous pouvez modifier votre code pour être quelque chose comme:

class Person 
{ 
     public int Id { get; set; } 
     public string Name { get; set; } 
} 

class PersonWithAge : Person 
{ 
     public int Age { get; set; } 
} 
3

PersonWithAge hériteront de gagnez de personne.

Comme ceci:

class PersonWithAge : Person 
{ 
     public int Age { get; set; } 
} 
4

Vous ne pouvez pas simplement jeter deux types sans rapport les unes aux autres. Vous pourriez permettre de convertir PersonWithAge en Person en laissant PersonWithAge hériter de Person. Puisque PersonWithAge est évidemment un cas particulier d'une personne, ce qui rend beaucoup de sens:

class Person 
{ 
     public int Id { get; set; } 
     public string Name { get; set; } 
} 

class PersonWithAge : Person 
{ 
     // Id and Name are inherited from Person 

     public int Age { get; set; } 
} 

Maintenant, si vous avez un IEnumerable<PersonWithAge> nommé personsWithAge, puis personsWithAge.Cast<Person>() fonctionnera.

Dans VS 2010, vous pourrez même sauter le casting tout à fait et faire (IEnumerable<Person>)personsWithAge, puisque IEnumerable<T> est covariante dans .NET 4.

1

Vous pouvez garder le IEnumerable<PersonWithAge> et ne se convertissent pas à IEnumerable<Person>. Il suffit d'ajouter une conversion implicite pour convertir un objet de PersonWithAge en Person lorsque vous en avez besoin.

class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public static implicit operator Person(PersonWithAge p) 
    { 
     return new Person() { Id = p.Id, Name = p.Name }; 
    } 
} 

List<PersonWithAge> pwa = new List<PersonWithAge> 
Person p = pwa[0]; 
Questions connexes