C# Microsoft Office Interop:无法将带[]的索引应用于类型为';对象';
以下是我的代码,之前已成功获取文档标题。但现在,它抛出如下所示的错误:C# Microsoft Office Interop:无法将带[]的索引应用于类型为';对象';,c#,vsto,office-interop,C#,Vsto,Office Interop,以下是我的代码,之前已成功获取文档标题。但现在,它抛出如下所示的错误: string sTitle = oActiveDoc.BuiltInDocumentProperties["Title"].Value; 错误: string sTitle = oActiveDoc.BuiltInDocumentProperties["Title"].Value as string; 无法将带[]的索引应用于“object”类型的表达式 基于一些类似的在线解决方案(如和),我尝试了以下代码,但仍然得到了
string sTitle = oActiveDoc.BuiltInDocumentProperties["Title"].Value;
错误:
string sTitle = oActiveDoc.BuiltInDocumentProperties["Title"].Value as string;
无法将带[]的索引应用于“object”类型的表达式
基于一些类似的在线解决方案(如和),我尝试了以下代码,但仍然得到了完全相同的错误
问题:我在这里可能缺少什么,如何解决
Ref:获取表示文档的所有内置文档属性的集合
以下也给出了完全相同的错误:
string sTitle = oActiveDoc.BuiltInDocumentProperties["Title"].Value as string;
或
试一试
你能试试吗
string sTitle;
dynamic properties = oActiveDoc.BuiltInDocumentProperties;
var property = properties["Title"];
if (property != null)
{
sTitle = property.Value.ToString();
}
有几种方法可以弥补目前为止存在的例外情况:
使用动态
和对象
引用。请在页面上阅读有关此方法的更多信息
使用该方法在.net framework中表示的后期绑定技术
当我尝试您的建议时,出现以下错误:object'不包含'Item'的定义,并且找不到接受'object'类型的第一个参数的可访问扩展方法'Item'(您是否缺少using指令或程序集引用?
我想知道问题是否与内置文档属性
是动态
类型有关。尽管多年来我一直使用string-sTitle=oActiveDoc.BuiltInDocumentProperties[“Title”].Value;
在我的许多VSTO
项目上,使用从VS2010
到最新的Visual Studio,但从来没有出现过这个问题。是的,没有使用动态项函数,但是.Net隐藏了属性索引器。发生了什么变化?它运行在不同的计算机上吗?您的office版本有变化吗?@MikeJ因为上面的代码一直在m上工作自2010年以来的各种VSTO
项目,显然是机器(XP、VISTA、Win10等)、Visual Studio版本(201020120320152019)以及Office版本92003/2007/2010/2016/O365等)也发生了变化。以前所有这些版本都使用了相同的代码行。从这一点来看,上面的代码行可能并不总是可靠的。听起来你找到了下面的答案,但只是出于好奇,你是否尝试将oActiveDoc.BuiltinoDocumentProperties转换为Microsoft.Office.Core.DocumentProperties?失败了吗?是的像您最初构建项目时使用的旧PIA一样的OUND不再适用于较新版本的office。后期绑定可能是最安全的方法,但我很好奇.net是否检测到相同的类型。您的解决方案有效(谢谢)。我不确定它是否在所有情况下都能工作。但就我的情况而言,现在是这样。但是,string-sTitle=oActiveDoc.builtinocumentproperties[“Title”].Value;
以前也能工作,现在也不能了。所以,让我祈祷吧。您提供的第一个链接可能是一个更持久的解决方案(我的投票)虽然有点复杂。谢谢你分享这个链接。
string sTitle;
dynamic properties = oActiveDoc.BuiltInDocumentProperties;
var property = properties["Title"];
if (property != null)
{
sTitle = property.Value.ToString();
}