Office中国论坛/Access中国论坛

标题: 【练习】如何获得一个COM对像的真实类型 [打印本页]

作者: faunus    时间: 2014-2-24 17:14
标题: 【练习】如何获得一个COM对像的真实类型
本帖最后由 faunus 于 2014-2-26 11:02 编辑

先上代码:

  1.         private void ThisAddIn_Startup(object sender, System.EventArgs e)
  2.         {
  3.             //Application 的三种调用形式
  4.             Excel.Application app;
  5.             app = Application;
  6.             app = this.Application;
  7.             app = Globals.ThisAddIn.Application;//在RIBBON中,只能这样调用。

  8.             //获得基本对像
  9.             Excel.Workbook book = app.ActiveWorkbook;
  10.             Excel.Worksheet sh = book.ActiveSheet;

  11.             //单元格对像
  12.             Excel.Range rA1 = sh.Cells[1, 1];

  13.             //开始随便撸
  14.             rA1.Value = "hello";
  15.             rA1.Formula = "=1+100";

  16.             //如何获得对像的真实类型
  17.             string typeA = rA1.GetType().ToString();
  18.             string typeB = Microsoft.VisualBasic.Information.TypeName(rA1);
  19.             System.Windows.Forms.MessageBox.Show
  20.                 (
  21.                     string.Format(
  22.                         "TypeA:{0},TypeB:{1}",
  23.                         typeA,
  24.                         typeB)
  25.                 );
  26.         }
复制代码




作者: faunus    时间: 2014-2-24 17:23
结果:

[attach]53158[/attach]


可以看到:
通过 GetType() 方法,
仅仅只能获得一个通用的COM类型说明: System._ComObject。
这个显然不是我们想要的,由于C#3.0开始提供动态类型,类型在编译期并不能够确定。
为此我们要想采用新的方法。
Microsoft.VisualBasic.Information.TypeName(rA1);
这明返回的类型说明正是我们需要的 Range 。


这时 vb.net 比 c# 在这个地方在略胜一筹了
如果是 VB.net 无需额外的引用,
而在 C# 中必须额外多一步操作,引用 Microsoft.VisualBasic 类型库。


其实对一些有代码洁癖的人来说,一定还是不够爽,
请不要着急,我会在接下来的 高级课程中 为大家提供一个纯 C#的解决方法,
不过要有心理准备哦,方法挺高级的,请先过了 初级班、中级班吧!







作者: 大雪无痕88    时间: 2014-2-24 17:31
我要多来学习学习,以后不会遇到问题时束手无策
作者: cc1027cc    时间: 2014-2-24 17:38
错误        9        命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“Information”。是否缺少程序集引用?        E:\vs10.0\ExcelAddIn1\ExcelAddIn1\ThisAddIn.cs        35        50        ExcelAddIn1


要引用哪个程序集

作者: 醉酒狂生    时间: 2014-2-24 17:56
火钳刘明
作者: faunus    时间: 2014-2-24 20:19
cc1027cc 发表于 2014-2-24 17:38
错误        9        命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“Information”。是否缺少程序集引 ...

需要对程序集进行引用:Microsoft.VisualBasic
[attach]53159[/attach]


作者: tianping    时间: 2014-2-24 22:18
本帖最后由 tianping 于 2014-2-24 22:29 编辑

public interface Range : IEnumerable{}
一开始声明Range时就是个接口,接口比类还原始,所以GetType()没有实质意义是必然的。不知这样理解对不?
高级班的方法一定很深奥!想看看迷底


作者: faunus    时间: 2014-2-24 22:20
tianping 发表于 2014-2-24 22:18
好深奥!
想看看迷底

现在不能看,那个太复杂,你一定会陷进去了。
作者: tianping    时间: 2014-2-24 22:27
faunus 发表于 2014-2-24 22:20
现在不能看,那个太复杂,你一定会陷进去了。

我先把前面的课一步一步学好
作者: lasharks    时间: 2014-2-25 20:16
已撸,但是不明白语句的含义。。。。
作者: 小雨新一    时间: 2014-2-26 21:00
老师,请问我也和4楼碰到一样的问题,您说添加引用Microsoft.VisualBasic,然后我这台电脑没查找到,还请帮忙看一下,需要怎么来修改,谢谢
作者: faunus    时间: 2014-2-26 21:21
小雨新一 发表于 2014-2-26 21:00
老师,请问我也和4楼碰到一样的问题,您说添加引用Microsoft.VisualBasic,然后我这台电脑没查找到,还请帮 ...

点程序集
作者: 小雨新一    时间: 2014-2-26 21:37
谢谢老师,已经出来了
作者: hehex    时间: 2014-2-28 19:32
已撸,完全不懂语句含义
作者: oldyuan    时间: 2014-5-7 18:27
学习来了。看来VB.net对VBA的支持还是比C#方便些。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3