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

标签 c# .net json implicit-conversion

我有以下业务对象:

    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/

相关文章:

c# - DataGrid 和 DataTemplate 的数据绑定(bind)问题

c# - Entity Framework 7 与 ASP.NET 4.6

c# - 检查服务器路径是否可用作 C# 中的文件共享

javascript - 使用 Javascript 将 JSON 对象名称传递给函数

iOS:使用 JSON 的 Twitter URL 路径?

c# - StringBuilder 的 AppendFormat 方法创建 Table

c# - EF Core 3.0 正确翻译 string.Equals ordinalIgnoreCase

c# - 3d 平铺地形

c# - 将两种类型的resx文件中的键和值导出到Excel c#.net

php - 显示本地存储的图像以响应 JSON 表填充结果