C#迭代通用对象

时间:2013-06-29 19:46:03

标签: c# .net excel vsto

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

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

我一直用它来检查给定的工作簿是否打开,或者工作簿是否包含具有特定名称的工作表等。因为集合和项参数被定义为对象,所以它可以用于任何事情。 / p>

我正在尝试在托管代码中创建相同的实用程序功能/方法,并且正在努力奋斗。问题出在collectionObject(itemObject)表达式上。 C#不允许我像VBA一样索引对象。

如果有人能指出我正确的方向,我将不胜感激。从我的搜索开始,我一直在调查QueryInterface,但我不确定这是不是我应该看的地方。似乎一个Excel对象是System._ComObject,所以我可能需要以某种方式迭代(?)。

TIA

2 个答案:

答案 0 :(得分:0)

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

这样的集合
IsInCollection = obj.Any(s => s != null);

答案 1 :(得分: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类。