gpt4 book ai didi

c# - 如何将自定义复杂类型转换为另一个自定义复杂类型

转载 作者:太空狗 更新时间:2023-10-29 18:11:21 25 4
gpt4 key购买 nike

所以我有两个像这样的自定义复杂类型(对于这个例子来说过于简单):

public class PendingProduct
{
public string Name { get; set; }
public string Description { get; set; }
public int ColorCount { get; set; }
}

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

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

因此,当我调用将 PendingProduct 转换为 Product 的方法时,我将执行一些自定义逻辑,将“ColorCount”个 ProductColor 对象添加到 Product 类。这完全过于简单化了,但是类的架构在这里真的无关紧要。

我的主要问题是:

当对象的属性不同时,将一种复杂类型转换为另一种复杂类型的最佳实践方法是什么?

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

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

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

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

最佳答案

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

我会在这里添加它以供您引用:

实际上你可以

1.反射(reflection)

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);
}
}

2.复制构造函数

public Employee(Person person)
{
// Copy properties
}

3.隐式/显式转换

public static implicit operator Employee(Person person)
{
// Build instance and return
}

4.AutoMapper

Mapper.Map<Person, Employee>(person);

5.3/4的组合:

public static implicit operator Employee(Person person)
{
return Mapper.Map<Person, Employee>(person);
}

关于隐式/显式转换运算符的说明:我相信使用这些运算符不会生成符合 CLS 的代码。

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

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

关于c# - 如何将自定义复杂类型转换为另一个自定义复杂类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4695159/

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