【发布时间】:2016-05-02 07:24:44
【问题描述】:
我正在将 Word VBA 宏转换为 C# 中的插件。
到目前为止,我已经成功地重构了 C# 中的所有语句、方法和属性,但是这让我很难过:
For Each l In Application.Languages
If InStr(LCase(l.NameLocal), LCase(Language)) > 0 Then
Selection.LanguageID = l.ID
Exit For
End If
Next l
我在 C# 中将上面的内容转换如下:
using Microsoft.Office;
using Microsoft.Office.Interop;
using Word = Microsoft.Office.Interop.Word;
Word.Application oWord = new Word.Application();
Word.Document oWordDoc = new Word.Document();
var Selection = oWordDoc.ActiveWindow.Selection;
string strTgtLanguage = "Hungarian";
foreach (var item in oWord.Application.Languages)
{
if (item.NameLocal.IndexOf(strTgtLanguage)>-1)
//The error is ---^ here on 'NameLocal'.
{
Selection.LanguageID = item.ID
//And here on 'ID' -----------------------^
break;
}
}
两个实例的编译器错误是:
“object”不包含“NameLocal”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“NameLocal”(您是否缺少 using 指令或程序集引用?)
我在这里做错了什么?我认为foreach 语句正确地声明了集合中的object。
提前致谢。
【问题讨论】:
-
在没有任何 Office 互操作库知识的情况下发言,我相信我在这里没有发现任何问题。您确定您的 C# 版本中的
Application.Languages与您的 VB 版本中的相同吗?我看到它们是相同的名称,但它们是同一类型吗?这听起来像是出了什么问题。我在 C# 中看到了oWord.Application.Languages,例如应该是Application.Languages吗? -
我发现的一个错误
Selection.LanguageID = l.ID应该是Selection.LanguageID = item.ID -
也就是说,我认为这不是严格意义上的语言问题。你有正确的语法,它的行为就像你期望的那样。这在 VB 中也是一个问题,所以我会以与您在那里相同的方式对其进行故障排除。但是,是的,Mosafizur 的评论也是正确的——只是第二条的一个错字。
-
在不了解 Office Interop 的情况下也可以这么说,但
Application.Languages很可能返回IEnumerable,而不是IEnumerable<SomeLanguageObject>。如果它应该返回一个特定类型的集合,你可以Cast它,即foreach (var item in oWord.Application.Languages.Cast<Language>()) { ... }。 -
dee 可能是对的。根据文档,
Languages实现了非泛型IEnumerable,因此迭代器将返回Object实例。而且,如果我没记错的话,VB 的 Object 是后期绑定的。将var更改为Language应该可以解决问题。
标签: c# vba foreach office-automation