将值从一个对象复制到另一个对象(不同类型)

2023-11-30

我需要将一个对象的某些属性复制到另一个对象。但是,某些属性需要从十进制到整数的类型转换。

我发现这个问题非常有用:将值从一个对象复制到另一个对象

但是,我不知道如何修改 Jon Skeet 和 Marc Gravell 的 MiscUtil 中的代码来检查属性类型以及源是否为十进制且目标是否为 int,以调用 Convert.ToIn32()。

这是 MiscUtil 的代码,我想弄清楚如何修改:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;

namespace MiscUtil.Reflection
{
    /// <summary>
    /// Generic class which copies to its target type from a source
    /// type specified in the Copy method. The types are specified
    /// separately to take advantage of type inference on generic
    /// method arguments.
    /// </summary>
    public static class PropertyCopy<TTarget> where TTarget : class, new()
    {
        /// <summary>
        /// Copies all readable properties from the source to a new instance
        /// of TTarget.
        /// </summary>
        public static TTarget CopyFrom<TSource>(TSource source) where TSource : class
        {
            return PropertyCopier<TSource>.Copy(source);
        }

        /// <summary>
        /// Static class to efficiently store the compiled delegate which can
        /// do the copying. We need a bit of work to ensure that exceptions are
        /// appropriately propagated, as the exception is generated at type initialization
        /// time, but we wish it to be thrown as an ArgumentException.
        /// </summary>
        private static class PropertyCopier<TSource> where TSource : class
        {
            private static readonly Func<TSource, TTarget> copier;
            private static readonly Exception initializationException;

            internal static TTarget Copy(TSource source)
            {
                if (initializationException != null)
                {
                    throw initializationException;
                }
                if (source == null)
                {
                    throw new ArgumentNullException("source");
                }
                return copier(source);
            }

            static PropertyCopier()
            {
                try
                {
                    copier = BuildCopier();
                    initializationException = null;
                }
                catch (Exception e)
                {
                    copier = null;
                    initializationException = e;
                }
            }

            private static Func<TSource, TTarget> BuildCopier()
            {
                ParameterExpression sourceParameter = Expression.Parameter(typeof(TSource), "source");
                var bindings = new List<MemberBinding>();
                foreach (PropertyInfo sourceProperty in typeof(TSource).GetProperties())
                {
                    if (!sourceProperty.CanRead)
                    {
                        continue;
                    }
                    PropertyInfo targetProperty = typeof(TTarget).GetProperty(sourceProperty.Name);
                    if (targetProperty == null)
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " is not present and accessible in " + typeof(TTarget).FullName);
                    }
                    if (!targetProperty.CanWrite)
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " is not writable in " + typeof(TTarget).FullName);
                    }
                    if (!targetProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " has an incompatible type in " + typeof(TTarget).FullName);
                    }
                    bindings.Add(Expression.Bind(targetProperty, Expression.Property(sourceParameter, sourceProperty)));
                }
                Expression initializer = Expression.MemberInit(Expression.New(typeof(TTarget)), bindings);
                return Expression.Lambda<Func<TSource,TTarget>>(initializer, sourceParameter).Compile();
            }
        }
    }
}

如果你有

public class Foo
{
    public decimal Value { get; set; }
}

public class Bar
{
    public int Value { get; set; }
}

然后与自动映射器(可从 NuGet 获得)您可以将对象 Foo 映射到对象 Bar,如下所示:

Mapper.CreateMap<Foo, Bar>();
Foo foo = new Foo() { Value = 10.5M };
var bar = Mapper.Map<Bar>(foo);
// bar.Value = 10;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将值从一个对象复制到另一个对象(不同类型) 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 切入点不适用于通用接口

    我正在使用 Spring 框架 2 5 和它的 AOP 功能 我有一个切入点表达式 例如 Pointcut execution public org springframework batch item ItemReader read pu
  • 将 Task 类型保存到 String 会导致灾难性失败

    我正在尝试将我在 Canvas 上编写的 Ink 保存在一个类中 并使用在此找到的这两种方法重新加载它link private async Task
  • 如何在 Visual Studio C89 中按照其他代码声明可变长度数组 [重复]

    这个问题在这里已经有答案了 我知道在 VS 中所有变量都必须在块的顶部声明 但是如果我想要一个 VLA 即 如果我想做这样的事情 int result runalgorithm int vla result 上面的代码无效 因为vla必须在
  • 使用 CGridView、Yii 在 BELONGS_TO 模型列中搜索

    我有一个用于课程模型的 CGridView 小部件 this gt widget zii widgets grid CGridView array id gt lesson grid dataProvider gt model gt sea
  • 使用 SFML 库构建 CMake 项目

    我不明白如何使用构建 SFML 项目CMakeLists txt file 如果你有时间的话 请帮帮我 谢谢你 Details 我从官方网站下载了 SFML 库 https www sfml dev org index php 将其移至我的
  • 在 Windows 10 上使用 Python 关闭 WiFi?

    我一直在寻找一种使用脚本打开和关闭 wifi 的方法 我认为这可以通过进入飞行模式或其他方法来完成 当我在谷歌上搜索答案时 我找不到任何对 Windows 有用的东西 只找到 Android 甚至 macOS 的东西 有人有 2 个功能吗
  • 访问保存在类路径中的 Microsoft Access 数据库

    我正在尝试访问存储在类路径中的数据库 我已经安装了 ucanaccess 3 0 0 和所有必需的 jar 我的项目层次结构 这是我到目前为止的代码 public void login Connection conn try conn Dr
  • 是否可以仅为 d3 js 中树布局的子节点到子节点绘制虚线链接

    是否可以只为子节点到子子节点绘制虚线链接 父节点到其子节点应该是常规的连续链接 a b gt dashed links c d gt continues links a 有可能的 看看这个直播example 截图在这里 我创建了两种样式 一
  • 从数据帧的所有单元格值中删除前缀

    我有一个 pandas 数据框 如下所示 col1 col2 col3 field1 index1 value1 field2 index2 value2 field3 index3 value3 field1 index4 value4
  • 绕过 Delphi 7 中的 OutputDebugString?

    我想知道是否可以绕过 OutputDebugString 我希望 OutputDebugString 输出显示在 DebugView 中 而不是显示在内部 Delphi 事件查看器窗口中 但我找不到一种方法来告诉 Delphi 不要吞下 O
  • Payum Paypal Rest config_path

    我正在尝试使用 symfony 3 1 4 中的 payum 包来实现 paypal rest 支付 我需要在我的 Symfony 应用程序中运行 PayPal Plus 因此我读了这篇文章https github com Payum Pa
  • Restful PUT 方法的 ModelAttribute 未填充值 ( JSON )

    我正在使用 Spring MVC 构建一个完全安静的 Web 应用程序 当我有 PUT 方法时 我的 ModelAttribute 表单 bean 未填充 所有值均为 null 如果我使用 POST 方法 所有内容都会正确填充 我用 Pos
  • CMake - set_property 找不到 CACHE 变量

    免责声明 我知道this问题 然而 OP 的需求与我的不同 他真正想要的是将应用程序移植到 Linux 因此答案就在那一行 而不是回答我想知道的 错误的原因 我正在尝试按照中的说明在 CMake GUI 中创建一个下拉列表here and
  • 尝试在 C shell 中实现管道挂起并且未运行命令

    我正在尝试运行这个命令ps j more 我认为我已经正确设置了管道 但由于某种原因它只是挂起 我正在调用一个正在运行的 forkps j和第二个运行的叉子more并用管道将它们连接起来 由于某种原因 这仍然没有按预期工作 代码如下 def
  • 如何在 R 中使用 GenSA 函数进行数学约束

    我目前正在尝试使用模拟退火包 GenSA 来最小化以下功能 efficientFunction lt function v t v Cov Mat v 其中 Cov Mat 是从 4 个资产获得的协方差矩阵 v 是维度 4 的权重向量 我正
  • 通过在另一列中出现多个值来过滤组[重复]

    这个问题在这里已经有答案了 如同这个问题但又增加了皱纹 我想仅过滤在组的任何行的特定列中同时具有两个 或全部多个 值的行组 例如 假设我有这个数据框 df lt data frame Group LETTERS c 1 1 1 2 2 2
  • 当我关闭灯箱时停止播放视频

    我用这个建立了一个弹出窗口article看起来真的很好 这是我所做的
  • OpenCV 中的连接组件

    我正在寻找一个 OpenCV 函数 它可以找到连接的组件并对其执行一些任务 例如获取对象中的像素数 轮廓 像素列表等 OpenCV C 有没有类似于MatLab的regionprops的函数 从3 0版本开始 OpenCV有connecte
  • 不使用 sklearn 从数据构建混淆矩阵

    我正在尝试在不使用 sklearn 库的情况下构建混淆矩阵 我无法正确形成混淆矩阵 这是我的代码 def comp confmat currentDataClass 1 3 3 2 5 5 3 2 1 4 3 2 1 1 2 predict
  • 将值从一个对象复制到另一个对象(不同类型)

    我需要将一个对象的某些属性复制到另一个对象 但是 某些属性需要从十进制到整数的类型转换 我发现这个问题非常有用 将值从一个对象复制到另一个对象 但是 我不知道如何修改 Jon Skeet 和 Marc Gravell 的 MiscUtil