使用 _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 对象。
在网络上调查,我发现获得文件内置 属性 值(如 '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 对象。