ReSharper可以生成将属性从一个对象复制到另一个对象的代码吗?

时间:2009-08-04 15:33:17

标签: c# visual-studio resharper

我正在寻找一种在编写代码时加速可重复任务的方法。我有ReSharper,我认为定制可以做我需要的。

我有两个相同类型的对象。我想将一个对象的所有公共属性复制到另一个对象。我想在这种情况下使用ReSharper工具为我生成代码。我会告诉它第一个对象和第二个对象的名称。我希望它能找到第一个对象的所有公共属性,并将值复制到第二个对象。

以下是我希望使用像ReSharper这样的工具生成的代码类型:

foo.Name = moo.Name;
foo.Age = moo.Age;
foo.City = moo.City;

自动化这个简单的代码,从右到左复制值将节省大量时间,我认为ReSharper可以做到这一点。但是,我在搜索时没有看到任何弹出窗口。

我不是在寻找CodeSmith代码生成技术或T4模板,因为我只希望它在我的类中生成这些特定的行,而不是生成整个类或单独的文件。

有没有人知道按下几个按键的方法,输入上面的“foo”和“moo”对象名称并让工具从右到左的代码行生成这些副本?

更新:

我找到了一些关于构建ReSharper扩展的文档,这可能是通过这条路径实现的,但看起来真的很复杂。

http://www.jetbrains.net/confluence/display/ReSharper/PowerToys+Pack+3.0+User+Guide

这开始看起来像周末挑战,除非其他人已经写过。

8 个答案:

答案 0 :(得分:53)

这真的很容易。 ReSharper没有这样做,但你可以使用超级duper REGEX!

在Visual Studio中:

    public string Email { get; set; }
    public string CellPhone { get; set; }
    public int NumChildren { get; set; }
    public DateTime BirthDate { get; set; }
  1. 选择所有属性。点击 CTRL-D 进行复制。

  2. 现在点击 CTRL-H 进行替换。确保选择 .* 进行正则表达式匹配。

  3. 替换:public [\w?]* (\w*) .*(此正则表达式可能需要调整)

  4. 使用:dest.$1 = source.$1;

  5. 现在您可以选择一些漂亮的代码:

        dest.Email = source.Email;
        dest.CellPhone = source.CellPhone;
        dest.NumChildren = source.NumChildren;
        dest.BirthDate = source.BirthDate;
    

答案 1 :(得分:11)

这有点来自@Jess的答案(他的正则表达式在VS2013上对我不起作用)但不是使用Visual Studio我是using regex101

点击上面的链接,然后将您的属性粘贴到Test string字段中,您就会将其映射到其中。

正则表达式我用过

public [A-Za-z\?]* ([A-Za-z0-9]*) .*

并替换

Dest.$1 = Source.$1

希望这可以节省你一些时间。

答案 2 :(得分:9)

我不相信Resharper可以做到这一点,但开源AutoMapper可以。 AutoMapper新手?查看Getting Started页面。

答案 3 :(得分:4)

我同意@Ben Griswold 在大多数情况下,Automapper是最佳选择。

但是当你真正想要生成将属性从一个对象复制到另一个对象的代码时,请尝试:

  1. 创建一个全新的类,并从要从中复制属性的类派生。
  2. 右键单击此新派生类,然后单击“重构>提取界面'。
  3. 检查您要复制的所有媒体资源。
  4. 选择“旁边放置”,因为此界面只是暂时的。
  5. 点击“下一步”。
  6. 修改派生类,以便不再继承基类,而只是实现新接口。期待看到红色的波浪形。
  7. 将光标放在红色波浪线上,然后点击“ALT-ENTER”转到“实施会员”。
  8. 点击“完成”。
  9. 删除该临时界面并修改您的课程,以便您不再实施它。

答案 4 :(得分:1)

这是一个克隆对象的简单类。这不完全是你所要求的,但也许这对你有用:

//.Net 2.0
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;

namespace YourNameSpace {
   public static class ObjectCloner {
      public static T Clone<T>(T obj) {
         using (MemoryStream buffer = new MemoryStream()) {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(buffer, obj);
            buffer.Position = 0;
            T temp = (T)formatter.Deserialize(buffer);
            return temp;
         }
      }
   }
}

答案 5 :(得分:1)

根据@Matas的回答,我创建了一个更健壮的版本using regex101,它忽略了泛型,属性和注释并规范化了空格。

正则表达式:*((\/+.*\n*.*)|(\[.*\]\n*.*))*public [A-Za-z\_\?\<\>]* ([A-Za-z0-9\_]*).*(\n| )*

替换:$4 = person.$4,\n

答案 6 :(得分:-1)

这是Cog闪耀的事情。基本上,Cog是代码生成工具。代码是通过Python生成的。

答案 7 :(得分:-2)

简单地将值从一侧复制到另一侧非常难看。

您可能会发现创建一个方法以包含在使用反射来复制公共属性的类中更好。您可以将此方法保存在resharper中,以重新生成您需要此功能的其他类。

相关问题