我将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'的定义,找不到扩展方法'NameLocal'接受类型为'object'的第一个参数(是否缺少using指令或程序集引用?)
我在这里做错了什么?我认为该foreach
声明正确地声明object
了集合中的。
提前致谢。
替换var item
为类型名称。
foreach (var item in oWord.Application.Languages)
用。。。来代替 foreach (Word.Language item in oWord.Languages)
在第一种情况下,var
变量item
的类型为System.Object
。
使用Linq的完整for-each可能是这样的:
foreach (Word.Language item in oWord.Languages.Cast<Word.Language>()
.Where(item => item.NameLocal.IndexOf(strTgtLanguage, StringComparison.Ordinal) > -1))
{
selection.LanguageID = item.ID;
break;
}
或者for-each可以替换为例如FirstOrDefault
:
Word.Language hungarian =
oWord.Languages.Cast<Word.Language>()
.FirstOrDefault(item => item.NameLocal.IndexOf(strTgtLanguage, StringComparison.Ordinal) > -1);
if (hungarian != null)
selection.LanguageID = hungarian.ID;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句