c# - 在 lambda 中使用匿名类型映射或部分克隆任意数量的对象属性

标签 c# .net delegates lambda anonymous-types

我想创建一个克隆或映射函数,我可以指定(一次)将哪些属性复制到目标对象。

重点这里的用法看起来像这样
(灵感来自于使用 GroupBy),

var botchedOrder = db.BuildingOrders.Find(id);
var redo = db.BuildingOrders.Create();
botchedOrder.MapTo(redo, x => new { x.BasePrice, x.FileAttachments, x.Notes });

这超出了我的理解,但我正在猜测这样的事情,

public static void MapTo<TObject, TProps>(
    this TObject source,
    TObject target,
    Action<TProps> properties) //?
{
    //copy the defined properties from source to target somehow?
    //originally I thought I could make an array of delegates..
}

如果这可行,那么当我显式克隆或映射对象时,我可以更轻松地以不同方式处理不同的属性集。我想坚持使用 .NET 来做到这一点。

编辑:忘记指明 void

最佳答案

我建议查看 AutoMapper因为它解决了相同类型的问题。此外,不同的 ORM 源​​(如 Massive、Petapoco 等)都有一些实现(因为它们需要将数据从数据库映射到对象)。

基本上,它可以使用反射来工作 - 迭代给定的字段/属性并将它们设置为另一个对象(也通过反射)。有一些使用 IL 生成器或表达式树生成动态方法的方法,这些方法将所有反射代码包装到一个在运行时生成和编译的漂亮且快速的方法中(从而提高性能)。

另一种方法是使用动态或字典而不是匿名类 - 这将消除“匿名性”问题并且只需要将特定键映射到属性 - 可以再次通过反射完成(例如使用 [MappingAttribute( "Key")] 用于区分 - 属性是虚构的,只是为了给出一个大概的概念)。

关于c# - 在 lambda 中使用匿名类型映射或部分克隆任意数量的对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901506/

相关文章:

c# - 并行传递归约

c# - 插件中的 CRM 365 callManagerInfo 错误

.net - REST API 仅设置对象的某些属性

c# - 如何使用 C#/.NET 在 Windows 中使用拨号 (RAS) 连接?

ios - 无法正确执行方法调用

ios - ViewController 的多个委托(delegate)

c# - 为方法编写 NUnit 测试用例

.net - Visual Basic 的 .Net 4.5 有哪些新功能?

ios - awakeFromNib 的好处?

c# - 如何从外部脚本调用 HTML 中的 JavaScript 函数