使用 _oledocumentproperties.SummaryProperties 实例上的反射按名称获取文件 属性 值

Get file property value by name using Reflection on _oledocumentproperties.SummaryProperties instance

在网络上调查,我发现获得文件内置 属性 值(如 'Author'、'DateLastSaved' 或 'Company' 的唯一示例如下所示:

string filePath= @"C:\Users\ME\Desktop\PaperSpecs.docx";
DSOFile.OleDocumentProperties file = new DSOFile.OleDocumentProperties();
file.Open(filePath, false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);

Console.WriteLine("Author: " + file.SummaryProperties.Author.ToString());
Console.WriteLine("DateLastSaved: " + file.SummaryProperties.DateLastSaved.ToString());
Console.WriteLine("Company: " + file.SummaryProperties.Company.ToString());

让我们考虑通过 属性 名称检索一个值...我的意思是实现一个具有两个参数的函数:i) DSOFile.OleDocumentProperties 实例; ii) 属性 名称 (string propName)。 我的第一个想法,但我认为 "most stupid way" 也包括实现一个检查 propName 值的开关案例,然后根据该值,returns 相关的 _oledocumentproperties.SummaryProperties 属性...即:

...
string val= null;
switch(propName)
{
  case case "Author":
   val= file.SummaryProperties.Author.ToString(); break;
  case case "DataLastSaved":
   val= file.SummaryProperties.DataLastSaved.ToString(); break;
  ...
  default: throw new Exception("Property not found");
 }
return val;

但我不喜欢这个解决方案,它是 "too long" 编写和 "not easy" 维护。也许有更好的方法来实现此功能...例如使用 C# 反射的强大功能!我不太擅长处理反射,但我尝试过做类似的事情:

...
Type t = file.SummaryProperties.GetType();
System.Reflection.PropertyInfo p = t.GetProperty(propName);
object value = p == null ? null : p.GetValue(file.SummaryProperties, null);
return value.ToString();

问题是 p 实例总是 null!!!

我的问题是:您知道实现我正在寻找的功能的更好方法吗?或者你能调整我最后的代码提示来通过反射解决我的问题吗? 谢谢大家!!!

Here 是答案...反射不适用于 COM 对象。