C# 如何将自定义复杂类型转换为其他自定义复杂类型

C# 如何将自定义复杂类型转换为其他自定义复杂类型,c#,oop,entity-framework,entity-framework-4,C#,Oop,Entity Framework,Entity Framework 4,因此,我有两种类似这样的自定义复杂类型(本例过于简化): 假设我需要这个对象知道如何将自身转换为另一种类型: public class Product { public string Name { get; set; } public string Description { get; set; } public ProductColors Colors { get; set;} } 因此,当我调用一个方法将PendingProduct转换为Product时,我将执行一

因此,我有两种类似这样的自定义复杂类型(本例过于简化):

假设我需要这个对象知道如何将自身转换为另一种类型:

public class Product
{
    public string Name { get; set; }
    public string Description { get; set; }
    public ProductColors Colors { get; set;}
}
因此,当我调用一个方法将PendingProduct转换为Product时,我将执行一些自定义逻辑,将ProductColor对象的“ColorCount”数量添加到Product类中。这完全是过于简单化了,但是类的体系结构在这里实际上是无关紧要的

我的主要问题是:

当对象的属性不同时,实现从一个复杂类型到另一个复杂类型的转换的最佳实践方法是什么

在现实世界中,属性是非常不同的,我将编写一些自定义逻辑来将我需要的从对象A映射到对象B

显然,我可以编写一个函数,它接受对象a的输入参数并返回对象B,但我正在寻找一个更“最佳实践”的方法。IConvertible在这里起作用了吗?有没有更像OOP的东西,我可以利用它,而不仅仅是编写一个函数来做我想做的事情

对象A应该始终知道如何将自身转换为对象B


编辑:作为旁注,在现实世界中,对象a和对象B都是实体框架4实体。我想获取一个“挂起的产品”,将其转换为一个新的产品实体,将其附加到数据上下文并保存。

有很多方法可以做到这一点,但它们实际上可以归结为要么自己编写映射代码,要么通过反射处理它,要么依赖一个预构建的框架,比如。我在另一个问题中回答了一个类似的问题

我将添加到此处供您参考:

实际上你可以

1.反思

public void Map<TSource, TDestination>(TSource source, TDestination destination)
{
  var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
  var type = typeof(TDestination);

  foreach (var prop in props)
  {
    object value = prop.GetValue(source, null);

    var prop2 = type.GetProperty(prop.Name);
    if (prop2 == null)
      continue;

    if (prop.PropertyType != prop2.PropertyType)
      continue;

    prop2.SetValue(destination, value, null);
  }
}
3.隐式/显式转换

public static implicit operator Employee(Person person)
{
  // Build instance and return
}
4.汽车制造商

Mapper.Map<Person, Employee>(person);
Mapper.Map(个人);
5.3/4的组合:

public static implicit operator Employee(Person person)
{
  return Mapper.Map<Person, Employee>(person);
}
公共静态隐式运算符雇员(个人)
{
返回Mapper.Map(人);
}
关于隐式/显式转换运算符的说明:我相信使用这些运算符不会生成符合CLS的代码

AutoMapper允许您自定义如何映射目标类型上的不同属性,例如:

Mapper.CreateMap<Person, Employee>()
      .ForMember(e => e.Forename, o => o.MapFrom(p => p.Forename.ToLower()));
Mapper.CreateMap()
.ForMember(e=>e.Forename,o=>o.MapFrom(p=>p.Forename.ToLower());

您不想从产品派生PendingProduct吗

public class Product 
{     
  public string Name { get; set; }     
  public string Description { get; set; }     
  public ProductColors Colors { get; set; } 
} 

public class PendingProduct : Product 
{         
  public int ColorCount { get; set; } 
}
Mapper.CreateMap<Person, Employee>()
      .ForMember(e => e.Forename, o => o.MapFrom(p => p.Forename.ToLower()));
public class Product 
{     
  public string Name { get; set; }     
  public string Description { get; set; }     
  public ProductColors Colors { get; set; } 
} 

public class PendingProduct : Product 
{         
  public int ColorCount { get; set; } 
}