gpt4 book ai didi

c# - 将类的现有实例转换为更具体的子类

转载 作者:行者123 更新时间:2023-11-30 13:28:13 25 4
gpt4 key购买 nike

情况:我有一个我公司购买的大型收缩包装应用程序。它应该是可扩展的,yada,yada。它具有 SQL 和 DLL 形式的 DB、DAL 和 BLL。它也有一个 MVC 项目(可扩展部分),但 95% 的“模型”部分在 DAL/BLL 库中。

问题:我需要扩展位于 BLL 中的“模型”之一。它是一个具有 47 个属性、0 个方法且没有构造函数的 User 对象。我开始的是他们类(class)的简单推导,例如:

public class ExtendedUser : BLL.DTO.User
{
public bool IsSeller { get; set; }
public bool IsAdmin { get; set; }
}

如果我只是创建一个新的 ExtendedUser,这会很好地工作。但是,它由另一个对其 BLL 的调用填充,例如:

BLL.DTO.User targetUser = UserClient.GetUserByID(User.Identity.Name, id);

我尝试了直接的暴力尝试,这当然会抛出一个 Cast Exception:

ExtendedUser targetUser = (ExtendedUser)UserClient.GetUserByID(User.Identity.Name, id);

我对这个非常简单的 OO 概念一无所知。我不想编写接受现有用户对象然后将每个属性复制到我的扩展对象中的构造函数。我知道有一种正确的方法可以做到这一点。谁能拍打我的脑袋然后告诉我显而易见的事情?

TIA

最佳答案

如果您确实想使用继承,那么对于 47 个属性,像 Automapper 这样的东西可能会帮助您复制所有值 - http://automapper.codeplex.com/ - 这将允许您使用:

// setup
Mapper.CreateMap<BLL.DTO.User, ExtendedUser>();

// use
ExtendedUser extended = Mapper.Map<BLL.DTO.User, ExtendedUser>(user);

或者,您最好使用聚合而不是继承 - 例如

public class AggregatedUser
{
public bool IsSeller { get; set; }
public bool IsAdmin { get; set; }
public BLL.DTO.User User { get; set; }
}

关于c# - 将类的现有实例转换为更具体的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6765096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com