【问题标题】:Why is the C# CreateObject so much more verbose than VB.NET?为什么 C# CreateObject 比 VB.NET 更冗长?
【发布时间】:2012-09-01 09:57:40
【问题描述】:

我希望将一些 VB6/COM+ 代码转换为 C#/COM+

但是我在 VB6 或 VB.NET 中的哪个位置:

Dim objAdmin
objAdmin = Server.CreateObject("AppAdmin.GUI")
objAdmin.ShowPortal()

在 C# 中,我似乎必须执行以下操作:

object objAdmin = null;
System.Type objAdminType = System.Type.GetTypeFromProgID("AppAdmin.GUI");
m_objAdmin = System.Activator.CreateInstance(objAdminType);
objAdminType.InvokeMember("ShowPortal", System.Reflection.BindingFlags.InvokeMethod, null, objAdmin, null);

有没有办法让 c# 不必使用 InvokeMember 函数而直接调用该函数?

【问题讨论】:

  • 简短回答:因为 VB 从一开始就是为使用 COM 对象而设计的,而 C# 不是。

标签: c# vb.net com


【解决方案1】:

有没有办法让 c# 不必使用 InvokeMember 函数而直接调用该函数?

是的,从带有dynamic typing 的 C# 4 开始:

dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI"));
admin.ShowPortal();

CreateObject 部分更加冗长,但如果需要,您可以随时将其封装在方法调用中。 (可能有一个我不知道的现有调用,或者您可以尝试查找 VB 在这种情况下调用的任何内容 - 我不知道 Server.CreateObject 的详细信息。)

请注意,动态类型比只是更丰富,使反射更简单,但它确实做到了。在幕后,虽然这两种情况都会发生同样的事情 - 它仍然不会像静态绑定那样快,但几乎可以肯定足够

【讨论】:

    【解决方案2】:

    是的,您可以使用dynamic 关键字

    dynamic objAdmin = System.Activator.CreateInstance(objAdminType);
    objAdmin.ShowPortal();
    

    【讨论】:

      【解决方案3】:

      如果你可以访问实际的类类型,你可以这样做:

      AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass));
      m_objAdmin.ShowPortal();
      

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 2013-06-24
        • 1970-01-01
        相关资源
        最近更新 更多