我需要一个项目的副本,但我找不到像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
改变。解决方案是什么?
答案 0 :(得分:0)
我相信你正在寻找这个
这里的链接也可能有用
此代码来自我的评论中的链接 - 为了您而改为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应用程序,并且您无法使用IClonable
或Object.MemberwiseClone
等.NET功能。你只能告诉MS Project该做什么,它会以某种方式做到这一点,但没有人知道如何。