You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MS Project设置assignment.Cost触发非法参数异常求助

问题分析与修复建议

咱们来拆解你代码里可能触发Illegal Argument Exception的几个关键点,同时优化你的代码逻辑:

1. 重复添加同名资源导致的混乱

你每次进入if (!task.Kosten.Equals("0"))分支时,都会执行project.Resources.Add("asd"),这会导致项目里堆积多个名为"asd"的资源。后续遍历资源时,可能匹配到错误的实例,进而在创建分配时引发异常。

修复:先检查资源是否已存在,不存在再添加:

Resource asdResource = project.Resources.Cast<Resource>().FirstOrDefault(r => r.Name.Equals("asd"));
if (asdResource == null)
{
    asdResource = project.Resources.Add("asd");
}

2. 直接赋值Assignment.Cost的限制

MS Project对象模型中,Assignment.Cost默认是计算字段(由资源费率×工时自动计算得出),直接赋值可能会因为项目设置不允许手动编辑成本而抛出异常。

解决思路:

  • 如果你确实需要手动设置成本,先确保项目允许手动编辑成本:
    // 开启允许手动设置分配成本的选项
    project.Set(ProjectField.PJ_PROJECT_INFO_TASK_COST_METHOD, (int)PjTaskCostMethod.pjTaskCostMethodFixed);
    
  • 更符合原生逻辑的方式:通过设置资源费率和分配工时间接计算成本,避免直接修改计算字段:
    // 假设你有计划工时plannedWorkHours(单位:小时)
    asdResource.StandardRate = kosten / plannedWorkHours; 
    // MS Project中工时单位是分钟,所以转换单位
    taskAssignment.Work = plannedWorkHours * 60; 
    

3. 冗余遍历增加出错概率

你在添加分配后又遍历newTask.Assignments去找"asd"的分配,其实Assignments.Add()方法会直接返回创建好的Assignment对象,完全不需要循环查找——这不仅低效,还容易因为多个同名资源导致匹配错误。

优化:直接使用Add方法返回的对象:

if (!task.Kosten.Equals("0") && Double.TryParse(task.Kosten, out double kosten))
{
    // 先获取或创建测试资源
    Resource asdResource = project.Resources.Cast<Resource>().FirstOrDefault(r => r.Name.Equals("asd")) ?? project.Resources.Add("asd");

    // 直接创建并获取分配对象
    Assignment newAssignment = newTask.Assignments.Add(newTask.ID, asdResource.ID);
    // 记得先处理项目设置再赋值
    newAssignment.Cost = kosten;
}

4. 未处理Double.TryParse失败的情况

如果task.Kosten无法解析为数字,kosten会默认是0,这时候后续赋值可能不符合预期,最好加上解析成功的判断,避免无效操作。

完整优化后的代码示例

if (!task.Kosten.Equals("0") && Double.TryParse(task.Kosten, out double kosten))
{
    // 检查并获取测试资源
    Resource testResource = project.Resources.Cast<Resource>()
        .FirstOrDefault(r => r.Name.Equals("asd")) ?? project.Resources.Add("asd");

    // 创建分配并直接获取对象
    Assignment taskAssignment = newTask.Assignments.Add(newTask.ID, testResource.ID);

    // 若需手动设置成本,先开启对应项目设置
    project.Set(ProjectField.PJ_PROJECT_INFO_TASK_COST_METHOD, (int)PjTaskCostMethod.pjTaskCostMethodFixed);
    
    // 尝试设置成本
    taskAssignment.Cost = kosten;
}

内容的提问来源于stack exchange,提问作者LadyEmilcious

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:43:35