2

我正在使用 C# 从 Excel VBA 迁移到 VSTO。在 VBA 中,我有一个 3 行自定义函数IsInCollection,如下所示:

On Error Resume Next
Set obj = collectionObject(itemObject)
IsInCollection = Not (obj is Nothing)

我一直使用它来检查给定的工作簿是否打开,或者工作簿是否包含具有特定名称的工作表等。因为集合和项目参数被定义为对象,它可以与任何东西一起使用。

我正在尝试在托管代码中创建相同的实用程序函数/方法,并且正在苦苦挣扎。问题在于collectionObject(itemObject)表达式。C# 不允许我像 VBA 那样只索引一个对象。

如果有人能指出我正确的方向,将不胜感激。从我的搜索中,我一直在研究 QueryInterface,但不确定这是否是我应该寻找的地方。似乎 Excel 对象以 . 的形式出现System._ComObject,所以大概我需要以某种方式遍历它(?)。

TIA

4

2 回答 2

0

我想你想看看 LINQ。例如,您可以查询集合,例如

IsInCollection = obj.Any(s => s != null);
于 2013-06-29T20:53:36.827 回答
0

C# 中的索引运算符是 [],而不是 VB 中的 ()。不过,我对 COM 不是很熟悉,所以如果您拥有的对象只是一个对象/System._ComObject,您可能必须先将其转换为适当的类型,除非 _ComObject 已经有索引器。

似乎找出 _ComObject 真正是什么类型可能有点困难,所以您可能想尝试一下我在http://www.mztools.com/articles/2006/mz2006013.aspx找到的技巧:

var typeName = Microsoft.VisualBasic.Information.TypeName( collectionObject );

我也怀疑你可以使用这个System.ComponentModel.TypeDescriptor类。

于 2013-06-29T23:18:13.270 回答