这是复制类的好方法吗? [关闭]

2024-05-11

我是一个十足的菜鸟,所以如果我不适合问这个问题,请告诉我,如果需要的话请给我引导。 无论如何......我一直在学习值类型和引用类型,并且想知道定义一个像这样的附加构造函数(然后稍后调用它)是否是创建类副本的有效方法。我尝试用一​​个简单的类来测试它,它似乎有效。

public ClassClass(ClassClass exampleClass)
    {
        var1 = exampleClass.var1;
        var2 = exampleClass.var2;
        // ...
    }

...


复制对象有两种类型。

  1. 参考副本
  2. 价值副本

要通过引用复制对象,只需使用“=”运算符即可。

e.g:

var o1 = new ClassClass();
var o2 = o1;

按值复制对象有多种方法,例如:

通过构造函数复制(如您所写)

    public class Student
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public Student(Student std)
        {
            FirstName = std.FirstName;
            LastName = std.LastName;
        }
    }

创建一个辅助类,将 s1 作为输入传递,并返回 s2 作为 结果

    static void Main(string[] args)
    {
        var s1 = new Student();
        var s2 = ClassHelper.CopyObject(s1);

    }

    public static class ClassHelper
    {
        public static Student CopyObject(Student std)
        {
            var newStudent = new Student()
            {
                FirstName = std.FirstName,
                LastName = std.LastName
            };
            return newStudent;
        }
    }

通用复制对象(使用反射)

private static void CopyClass<T>(T copyFrom, T copyTo, bool copyChildren)
{
    if (copyFrom == null || copyTo == null)
        throw new Exception("Must not specify null parameters");

    var properties = copyFrom.GetType().GetProperties();

    foreach (var p in properties.Where(prop => prop.CanRead && prop.CanWrite))
    {
        if (p.PropertyType.IsClass && p.PropertyType != typeof(string))
        {
            if (!copyChildren) continue;

            var destinationClass = Activator.CreateInstance(p.PropertyType);
            object copyValue = p.GetValue(copyFrom);

            CopyClass(copyValue, destinationClass, copyChildren);

            p.SetValue(copyTo, destinationClass);                  
        }
        else
        {
            object copyValue = p.GetValue(copyFrom);
            p.SetValue(copyTo, copyValue);
        }
    }
}

为这个类编写一个扩展方法,我建议这样做。

public static class ExtensionClass
{
    public static Student CopyAsNewObject(this Student std)
    {
        var newStudent = new Student()
        {
            FirstName = std.FirstName,
            LastName = std.LastName
        };
        return newStudent;
    }
}

    static void Main(string[] args)
    {
        var s1 = new Student();
        var s2 = s1.CopyAsNewObject();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是复制类的好方法吗? [关闭] 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 将 Promise 与 Transcrypt 一起使用

    我玩得很开心转密 http transcrypt org 一个出色的 Python 3 到 Javascript 编译器 可用作蟒蛇模块 https pypi python org pypi Transcrypt 我的大部分代码都是同步的
  • 替换核心数据模型,无需迁移

    我已经相当广泛地改变了我的核心数据模型 关于如何将旧数据迁移到新模型中存在很多问题 但是我不需要迁移任何内容 我只想替换当前的 Core Data 实例 如何才能做到这一点 我假设您正在使用持久存储协调器NSSQLiteStoreType
  • 使用网络摄像头捕获视频并使用 C# 保存为 avi [重复]

    这个问题在这里已经有答案了 可能的重复 网络摄像头捕获并转换为 avi https stackoverflow com questions 2807040 webcam capture and convert to avi 有没有办法使用
  • 多个线程将其结果填充到一个 DataTable C# 中

    我刚刚开始学习线程的概念 我有点陷入这个问题 它让我发疯 我实际上需要完成什么 我在本地目录中有大约 300 个文本文件 需要解析它们以获取特定值 在每个文本文件中找到这些 值 后 我需要将它们存储在数据库中 因此 我遵循访问目录中每个文本
  • 循环浏览 Excel Javascript API 中所有工作表的最佳方法?

    我想循环遍历工作簿中的每个工作表 并对每个工作表执行一项操作 例如 运行calculate 出于性能原因 我想将这一切都完成同步 请求 https learn microsoft com en us office dev add ins e
  • BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?

    我需要建立一个阻塞优先级队列 我的预感是TakeFromAny https learn microsoft com en us dotnet api system collections concurrent blockingcollect
  • FTP 入站通道适配器的 FTP 问题

    我们的项目使用 ftp inbound channel adapter 从 FTP 服务器轮询文件 它工作正常 但在轮询之间不起作用 当我看到 FTP 服务器日志时 我看到 425 无法打开数据连接 现在 当我重新启动或停止并再次启动 ft
  • VSCode 在 React 的 JSX 中错误地格式化三进制

    我正在运行 VSCode 来开发我的 React 应用程序 我有一个简单的三元 isLoading
  • 在 python 中查找价格动量的有效方法:对列的最后 n 个条目求平均值

    我正在定义价格动量是给定股票过去动量的平均值n days 反过来 动量是一种分类 如果当天的收盘价高于前一天 则每天标记为 1 如果当天的收盘价低于前一天 则标记为 1 我的库存变化百分比如下 df close in percent np
  • modinfo srcversion:如何从我的源生成此版本?

    我有一个 Linux 模块的编译版本 然后我有大约 20 多个其源代码的变体 由于各种愚蠢的错误 我已经不知道哪个版本的源代码是我用来制作模块的实际版本了 我注意到modinfo
  • 如何调试内部错误?

    所以我有课Foo最终应该调整并重新加载类 它也有一个方法 private void redefineClass String classname byte bytecode ClassFileLocator cfl ClassFileLoc
  • C#中析构函数的使用?

    我对 C 中析构函数的使用有点困惑 据我所知我们不能打电话 根据我的愿望 析构函数会在垃圾收集器之前自动调用 以对类 对象 执行一些工作 所以我想问一下我们是否在 C 中使用析构函数 那么我们何时需要垃圾收集器 据我所知 析构函数可以处理内
  • 如何粘贴到Excel B列的最后一行?

    我需要将单元格从 H2 L2 一直向下剪切并将其粘贴到 B 列的最后一行 数据每次都会不同 所以我无法对任何范围进行硬编码 VBA 代码会很好 从 H2 L2 向下剪切并粘贴 插入到 B 列的最后一行 到目前为止我得到了 Range H2
  • 这个错误从何而来?错误:com.facebook.FacebookException:无法获取应用程序名称

    我无法弄清楚这一点 我已将我的密钥哈希和所有内容添加到 Facebook 网页 但我无法找出此错误 11 12 19 51 27 744 D HelloFacebook 5188 Error com facebook FacebookExc
  • DART:将来 then 的语法

    我不明白的语法then clause 1 myFuture 6 then erg gt print erg What s erg gt expr语法上 我以为这会是一个函数 但是 then callHandler2 erg 不起作用 错误
  • 如何使用 jQuery Validate 正确验证放置在多个选项卡上的 Twitter Bootstrap 表单?

    我有一个表单位于多个 Twitter 的 Bootstrap 选项卡上
  • 带有 viewbags 的 MVC 数据集

    如何将数据集放入视图袋中并在视图中显示结果 我有一个来自模型的数据集 并将其写入视图包 我想使用 foreach 循环从视图中的视图包中获取数据行 我已经有一个变量进入视图 所以我无法正常传递数据集 每页我还会有许多其他数据集 所以我认为
  • Android 操作系统上的 NFC 堆栈

    有人可以帮助我了解 NFC Android 堆栈的当前状态吗 随着OS 2 3发布了小型 NFC 支持 仅限于 NXP 标签读取 后来 Google 增强了 API 所以在OS 2 3 3支持更广泛的标签 并且还可以使用 p2p 我的问题是
  • 如何在 Angular 模板中嵌入 GitHub gist?

    角度忽略script其模板中包含标签 但加载 GitHub gist 需要它们 执行此操作的最佳做 法是什么 使用iframe 创造script动态标记 或者是其他东西 一种方法是创建一个iframe with script里面并在你希望你
  • 这是复制类的好方法吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一个十足的菜鸟 所以如果我不适合问这个问题 请告诉我 如果需要的话请给我引导 无论如何 我一直在学习值类型和引用类型 并且想知道定义一个像这