香港大学中文论坛

 找回密码
 注册
搜索
查看: 24107|回复: 0
打印 上一主题 下一主题

[技术经验交流] C#中实现VB中的CreateObject方法

[复制链接]
跳转到指定楼层
1#楼
发表于 2008-9-9 01:31:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经常看到有些VB的例子中直接用个CreateObject就可调用系统功能(大多是COM对象),像用户设定,网络设定等等。虽然C#中可以通过使用VB的命名空间的方法来调用CreateObject函数,但是这样比较没什么用,因为生成的对象的所带有的方法都不能使用。C#中还可以直接用添加引用的方式来调用一些对象,前提是你知道该添加哪个引用。

  当我上网搜索,已经搜索到很多VB的成功用CreateObject调用的例子,C#的例子却很难找到的时候,就干脆用类似VB的方法算了,很简单。免得继续在网络中大海捞针了。  

  C#中类似 CreateObject 的方法就是 System.Activator.CreateInstance. 后续的对象函数的调用可以通过InvokeMember方法来实现。  

  如在VB中的源代码如下:

  这种方式叫Late-Bind,关于早期绑定和后期绑定的区别见 http://msdn2.microsoft.com/zh-cn/library/0tcf61s1(VS.80).aspx  

  Public Sub TestLateBind()

   Dim o As Object = CreateObject("SomeClass")

   o.SomeMethod(arg1, arg2)

   w = o.SomeFunction(arg1, arg2)

   w = o.SomeGet

   o.SomeSet = w

  End Sub

  转换成C#的代码如下所示:

  public void TestLateBind()

  {

   System.Type oType = System.Type.GetTypeFromProgID("SomeClass");

   object o = System.Activator.CreateInstance(oType);

   oType.InvokeMember("SomeMethod", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2});

   w = oType.InvokeMember("SomeFunction", System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] {arg1, arg2});

   w = oType.InvokeMember("SomeGet", System.Reflection.BindingFlags.GetProperty, null, o, null);

   oType.InvokeMember("SomeSet", System.Reflection.BindingFlags.SetProperty, null, o, new object[] {w});

  }   

  里面有方法,属性的调用设定,很简单。  

  实际例子如下,调用Office功能的:  

   public void TestLateBind()

   {

   System.Type wordType = System.Type.GetTypeFromProgID( "Word.Application" );

   Object word = System.Activator.CreateInstance( wordType );

   wordType.InvokeMember( "Visible", BindingFlags.SetProperty, null, word, new Object[] { true } );

   Object documents = wordType.InvokeMember( "Documents", BindingFlags.GetProperty, null, word, null );

   Object document = documents.GetType().InvokeMember( "Add", BindingFlags.InvokeMethod, null, documents, null );

   }

  这种Activator.CreateInstance方法还可以用来创建实例,并调用某些接口方法。毕竟接口必须要实例才能调用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机访问本页请
扫描左边二维码
         本网站声明
本网站所有内容为网友上传,若存在版权问题或是相关责任请联系站长!
站长电话:0898-66661599    站长联系QQ:7123767   
         站长微信:7123767
请扫描右边二维码
www.jtche.com

小黑屋|手机版|Archiver|香港大学中文论坛 ( 渝ICP备17010310号-15 )

GMT+8, 2024-5-1 03:44 , Processed in 0.034499 second(s), 14 queries .

Powered by 重庆爱这代科技有限公司 X3.3

© 2001-2020 香港大学中文论坛

快速回复 返回顶部 返回列表