使用“静态隐式运算符”进行C#强制转换问题

时间:2020-02-05 21:21:33

标签: c# .net api asp.net-core casting

我这样做是为了可以从我的api返回更多基本类。

我可以使用“静态隐式运算符”语法来允许将自定义类从一种类型转换为另一种类型,但是我一次只能这样做。使用列表时如何转换自定义类型? 这是该类的Entity Framework Core版本:

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;
}

这是我想为自己的api响应列表的类的基本版本:

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;
    }
}

我一次可以投射一个,然后循环播放:

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

但是我想这样做:

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

但是当我尝试运行它时,出现以下铸造错误:

System.InvalidCastException:'无法将类型为'Db.Models.DivDbUser'的对象转换为类型为'ApiModels.DivUser'。'

1 个答案:

答案 0 :(得分:0)

尽管语法相同,但转换不是强制转换。

通过转换,您正在创建一个全新的对象,而强制转换只是在更改现有对象的数据类型。

尝试在Select中进行转换:

dbUsers = mContext.Users.ToList();
List<DivUser> users = dbUsers.Select(u => (DivUser)u).ToList();
相关问题