【问题标题】:C# Casting Using "static implicit operator" Problem [duplicate]使用“静态隐式运算符”问题的 C# Casting [重复]
【发布时间】:2020-02-05 21:21:33
【问题描述】:

我这样做是为了可以从我的 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'类型。'

【问题讨论】:

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


    【解决方案1】:

    尽管语法相同,但转换不是强制转换,因此不起作用。

    通过进行转换,您将创建一个完整的新对象,而转换只是更改现有对象的数据类型。

    尝试在Select 中转换每个:

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

    【讨论】:

    • 就是这样,非常感谢!!
    • 我会尽快选择你的答案!
    • 简单地说,conversion 会改变运行时类型,通常意味着信息丢失; cast 改变编译时类型,不会导致信息丢失。
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多