我该如何复制项目?

时间:2013-02-15 22:16:39

标签: c# interop copy ms-project

我需要一个项目的副本,但我找不到像Clone()或其他方法的方法。 这是我的代码:

 private void Change(ArrayList SecuenciasIniciales, Project pj)
        {
            Project pjTemp = pj; //not make a copy else the same reference   

            for (int i = 0; i < SecuenciasIniciales.Count;i++ )
            {
                int[] secuencia = (int[])SecuenciasIniciales[i];
                ChangeProjectTemp(secuencia,ref pjTemp,pj);

                pjTemp.Application.LevelingOptions(false, true, true, PjLevelOrder.pjLevelPriority, true, Type.Missing, Type.Missing, PjLevelPeriodBasis.pjDayByDay, true, false, Type.Missing);
                pjTemp.Application.LevelNow(true);

                if (Directory.Exists(Server.MapPath("") + "\\sample.mpp"))
                {
                    System.IO.File.Delete(Server.MapPath("") + "\\sample.mpp");
                }

                pjTemp.Application.FileSaveAs(Server.MapPath("") + "\\sample.mpp", PjFileFormat.pjMPP, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                pjTemp.Application.FileSave();
                pjTemp.Application.DocClose();
                pjTemp.Application.Quit(PjSaveType.pjDoNotSave);

              }
}

我不希望pj改变。解决方案是什么?

2 个答案:

答案 0 :(得分:0)

我相信你正在寻找这个

Deep Cloning Objects in C#

这里的链接也可能有用

Deep vs shallow cloning

此代码来自我的评论中的链接 - 为了您而改为Project。

可能适合您的浅拷贝示例:

class Project : ICloneable
{
   //rest of your class
   int blah;
   string blah2;

   public Project()
   {

   }
   //rest of your class

   public object Clone()
   {
      return this.MemberwiseClone();      // call clone method
   }
}

然后在您展示的代码中执行此操作 -

  Project pjTemp = (Project)pj.Clone(); 

答案 1 :(得分:0)

如何制作项目副本有两种可能的选择,它们都可以解决不同的任务。

任务1:您希望制作项目的副本,以便更快地分析项目,因为COM调用很慢。

解决方案:通过MS Project COM界面阅读您想要了解的项目,将数据保存到您自己的数据结构中,并根据数据结构做任何您想做的事情。 该任务的替代解决方案可以是将项目保存为XML并将XML反序列化为数据结构。

任务2:您希望使用MS Project API制作项目的副本,以便与新项目一起使用。例如。您的初始项目是模板。

解决方案:使用Application.FileSaveAs,然后使用新创建的文件。

了解您使用API​​对MS Project操纵项目非常重要,但MS Project不是.NET应用程序,并且您无法使用IClonableObject.MemberwiseClone等.NET功能。你只能告诉MS Project该做什么,它会以某种方式做到这一点,但没有人知道如何。