开发者

Cast/Convert IEnumerable<T> to IEnumerable<U>?

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 work around?

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: By the way PersonWithAge will always contain the same properties as Person plus a couple more.

EDIT 2 Sorry guys but I should have made this a bit clearer, say I have two db views in a database that contains the same columns but view 2 contains 1 extra field. My model view en开发者_开发问答tities are generated by a tool that mimics the database views. I have a MVC partial view that inherits from one of the class entities but I have more than one way to grab data...

Not sure if this helps but it means that I cant make personWithAge inherit from person.


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.


Make PersonWithAge inherit from Person.

Like this:

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


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];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜