gpt4 book ai didi

c# - C#中类型之间的隐式转换

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

我有以下业务对象:

    public abstract class Product
{
public int Id { get; set; }
public bool OnStock { get; set; }
}

public class ProductForImport : Product
{
public int ImportId { get; set; }
}

public class ProductForExport : Product
{
public int ExportId { get; set; }
public bool IsExportable { get; set; }
public bool IsUsable { get; set; }
public string OtherParam {get; set;}

public static implicit operator ProductForExport(ProductForImport pfi)
{
ProductForExport p = new ProductForExport();
p.Id = pfi.Id;
p.IsExportable = true;
p.ExportId = 0;
return p;
}
}

所以我可以在两种类型之间进行转换:

    static void Main(string[] args)
{
ProductForExport pfe = new ProductForExport();
pfe.Id = 1;
pfe.OnStock = true;

ProductForImport pfi = new ProductForImport();
pfi.ImportId = 200;

ProductForExport pfe2 = (ProductForExport)pfi;
}

这工作正常。

我有 100.000 个 ProductsForImport 项目。如果我理解正确,如果我将它们转换为 ProductsForExport 项目,我将在内存中拥有 100.000 +100.000 个项目 - 这是合理的。

我的问题是:我必须通过 JSON 服务发送这些“ProductForExport”对象,每个服务只需要每种类型属性的一些子集:

servicecall1 应该返回 ProductForExport1{ExportId,IsExportable}

servicecall2 应该返回 ProductForExport2{ExportId,IsUsable}

问题:我是否应该为这些新类型编写类似于上述示例的隐式转换 - ProductForExport1ProductForExport2(因此基本上创建 100.000+100.000 个新对象)

我可以用某种魔法从原始类型中“隐藏”不需要的属性,而无需创建新实例吗?

谢谢,

b.

最佳答案

如果您需要这种实体的解耦和分离 - 您可以创建 DTO对象以及每个业务对象,并使用 DTO 与服务进行通信。但是,如果您有很多业务实体,请考虑使用其他方法来避免维护 hell 。

public sealed class ExportProductDto
{
public(ProductForExport exportProduct)
{
// initialize fields
this.ExportId = exportProduct.ExportId;
}

public int ExportId { get; private set; }
}

顺便说一句,运算符重载的矫枉过正解决方案,使用 Adapter pattern在产品类型之间转换

要将适配与实体本身分离,请自行实现以下接口(interface):

public interface IProductAdapter<TImport, TExport>
{
TImport ToImportProduct(TExport exportProduct);
TExport ToExportProduct(TImport importProduct);
}

或其他适配器方法:

// Implement this interface for ProductForImport class
// public class ProductForImport : IExportProductAdapter, Product
public interface IExportProductAdapter
{
ProductForExport ToExportProduct();
}

// Implement this interface for ProductForExport class
// public class ProductForExport : IImportProductAdapter, Product
public interface IImportProductAdapter
{
ProductForImport ToImportProduct();
}

编辑:回复评论

// An example of IExportProductAdapter adapter implementation
public sealed class ProductForImport : Product, IExportProductAdapter
{
public int ImportId { get; set; }

public ProductForExport ToExportProduct()
{
ProductForExport p = new ProductForExport();
p.Id = this.Id;
p.IsExportable = true;
p.ExportId = 0;
return p;
}
}

然后代替:

 ProductForExport pfe2 = (ProductForExport)pfi;

你可以这样做:

 ProductForExport pfe2 = pfi.ToExportProduct();

关于c# - C#中类型之间的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099669/

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