2

I am doing this so I can return more basic classes from my api.

I can use the "static implicit operator" syntax to allow me to cast my custom classes from one type to another, but i can only do it one at time. How can I cast my custom types when working with lists? Here is my Entity Framework Core version of the class:

public class DivDbUser : DivDbBase, IDivDbTrackable
{
    [Required]
    [MaxLength(256)]
    public string Name { get; set; }

    [Required]
    [MaxLength(256)]
    public string Email { get; set; }

    [Key]
    public int Id { get; set; }

    [Required]
    public DateTimeOffset DateCreated { get; set; }

    public int CreatedByUserId { get; set; }

    [Required]
    public DateTimeOffset LastDateModified { get; set; }

    public int LastModifiedByUserId { get; set; }

    [ForeignKey("CreatedByUserId")]
    public DivDbUser CreatedByUser { get; set; }

    [ForeignKey("LastModifiedByUserId")]
    public DivDbUser LastModifiedByUser { get; set; }

    public ICollection<DivDbResourceAssignment> ResourceAssignments { get; set; }
    public ICollection<DivDbUserRole> UserRoles { get; set;
}

And here is my basic version of the class that I want to cast a list of for my api response:

public class DivUser : DivBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public DateTimeOffset DateCreated { get; set; }
    public int CreatedByUserId { get; set; }
    public DateTimeOffset LastDateModified { get; set; }
    public int LastModifiedByUserId { get; set; }

    public static implicit operator DivUser(DivDbUser dbUser)
    {
        DivUser user = new DivUser() {
            Id = dbUser.Id,
            Name = dbUser.Name,
            Email = dbUser.Email,
            DateCreated = dbUser.DateCreated,
            CreatedByUserId = dbUser.CreatedByUserId,
            LastDateModified = dbUser.LastDateModified,
            LastModifiedByUserId = dbUser.LastModifiedByUserId
        };
        return user;
    }
}

I can cast one at a time, and loop with:

        dbUsers = mContext.Users.ToList();
        List<DivUser> users = new List<DivUser>();
        foreach(DivDbUser dbUser2 in dbUsers)
        {
            DivUser user = dbUser2;
            users.Add(user);
        }

But I would like to do it this way:

dbUsers = mContext.Users.ToList();
List<DivUser> users = dbUsers.Cast<DivUser>().ToList();

But when I attempt to run it I get the following casting error:

System.InvalidCastException: 'Unable to cast object of type 'Db.Models.DivDbUser' to type 'ApiModels.DivUser'.'

CodeCaster
  • 147,647
  • 23
  • 218
  • 272
Tom Crosman
  • 1,137
  • 1
  • 12
  • 37

1 Answers1

0

A conversion isn't a cast, despite the syntax being identical, so that won't work.

By doing a conversion, you're creating a complete new object, whereas a cast is just changing the data type of an existing object.

Try converting each in a Select:

dbUsers = mContext.Users.ToList();
List<DivUser> users = dbUsers.Select(u => (DivUser)u).ToList();
Johnathan Barclay
  • 18,599
  • 1
  • 22
  • 35