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
相关产品推荐
相关产品推荐

