Cast/Convert IEnumerable to IEnumerable?

前端 未结 6 2043
我在风中等你
我在风中等你 2021-01-04 08:48

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

相关标签:
6条回答
  • 2021-01-04 09:19

    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 });
    
    0 讨论(0)
  • 2021-01-04 09:24

    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.

    0 讨论(0)
  • 2021-01-04 09:25

    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.

    0 讨论(0)
  • 2021-01-04 09:25

    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; }
    }
    
    0 讨论(0)
  • 2021-01-04 09:25

    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 讨论(0)
  • 2021-01-04 09:36

    Make PersonWithAge inherit from Person.

    Like this:

    class PersonWithAge : Person
    {
            public int Age { get; set; }
    }
    
    0 讨论(0)
提交回复
热议问题