The following complies but at run time throws an exception. What I am trying to do is to cast a class PersonWithAge to a class of Person. How do I do this and what is the wo
You can't cast because they are different types. You have two choices:
1) Change the class so that PersonWithAge inherits from person.
class PersonWithAge : Person
{
public int Age { get; set; }
}
2) Create new objects:
IEnumerable<Person> p = pwa.Select(p => new Person { Id = p.Id, Name = p.Name });
Use Select instead of Cast in order to indicate how to perform the conversion from one type to another:
IEnumerable<Person> p = pwa.Select(x => new Person { Id = x.Id, Name = x.Name });
Also as PersonWithAge will always contain the same properties as Person plus a couple more it would be better to have it inherit from Person.
You can't just cast two unrelated type into each other. You could make it possible to convert PersonWithAge to Person by letting PersonWithAge inherit from Person. Since PersonWithAge is obviously a special case of a Person, this makes plenty of sense:
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; }
}
Now if you have an IEnumerable<PersonWithAge> named personsWithAge, then personsWithAge.Cast<Person>() will work.
In VS 2010 you will even be able to skip the cast altogether and do (IEnumerable<Person>)personsWithAge, since IEnumerable<T> is covariant in .NET 4.
you might want to modify your code to be something like:
class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
class PersonWithAge : Person
{
public int Age { get; set; }
}
You can keep the IEnumerable<PersonWithAge> and don't convert it to IEnumerable<Person>. Just add an implicit conversion to convert an object of PersonWithAge to Person when you need.
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];
Make PersonWithAge inherit from Person.
Like this:
class PersonWithAge : Person
{
public int Age { get; set; }
}