【问题标题】:Accessing Task properties via reflection only works if the properties are explicitly accessed in my code只有在我的代码中显式访问属性时,通过反射访问任务属性才有效
【发布时间】:2019-09-21 07:53:41
【问题描述】:

我正在尝试通过System.Type.GetProperty("Finish") 在 MS 项目中访问 Task 的属性,但它看起来无法通过反射访问该属性(以及其他类似的属性,例如 Number1),除非我的代码特别使用该属性。这是我可以更改的编译器设置吗?我正在编写一个同步引擎,因此无法提前知道客户端系统可能会请求 Task 的哪个字段。

所以对于下面的示例,信息将为空。

System.Type ty = typeof(Task);
System.Reflection.PropertyInfo info = ty.GetProperty("Finish");

但使用下面的代码,信息作为有效的 PropertyInfo 对象返回。

Task tk = activeProject.ProjectSummaryTask;
object done = tk.Finish;
System.Type ty = typeof(Task);
System.Reflection.PropertyInfo info = ty.GetProperty("Finish");

我基本上预计GetProperty() 可以适用于Task 的API 中列出的所有属性(相当多)。

这是Finish 属性的API 链接:https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.msproject.task.finish?view=office-project-server

【问题讨论】:

  • 这是什么任务类型?它不是 System.Threading.Tasks.Task 或 Microsoft.Build.Utilities.Task,因为它们都没有 Finish 属性。我怀疑在这两种情况下,您正在访问不同名称空间中具有相同简单名称的不同类型。
  • 这是任务:using Task = Microsoft.Office.Interop.MSProject.Task;

标签: c# reflection task ms-project


【解决方案1】:

使用Task 对象的GetField 方法返回变量字段的值。

您需要通过内部字段 ID 来识别该字段——使用固有常量(例如 pjTaskFinish)或其数值(188743716)。

或者,您可以使用 Application 对象的 FieldNameToFieldConstant 方法将友好的字段名称转换为常量。

附言文档的 VBA 版本包含更多信息;大多数(如果不是全部)对象/方法/属性都是相同的。

【讨论】:

  • 非常感谢,我知道这种方法并在过去使用过,但它的问题是“GetField”将始终返回一个字符串 - 而不是一个值。这意味着除非我尝试以多种不同的格式解析数据,否则我无法分辨数据的类型。例如,“PercentComplete”字段的 GetField 将给出类似“10%”的值,而直接使用 Task.PercentComplete 或通过反射(当它被反射时)给出一个数字。我需要访问原始数据,而不是 GetField 提供的格式化数据。
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多