为什么C#CreateObject比VB.NET更冗长?

时间:2012-09-07 13:47:49

标签: c# vb.net com

我希望将一些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函数并直接调用该函数?

3 个答案:

答案 0 :(得分:11)

  

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

是的,从C#4到dynamic typing

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

CreateObject部分中它仍然更加冗长,但如果你愿意的话,你总是可以在方法调用中将它包装起来。 (可能是我不知道的现有调用,或者你可以尝试查找VB在这种情况下调用的内容 - 我不知道Server.CreateObject的详细信息。)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:-1)

如果您可以访问实际的类类型,则可以按如下方式进行操作:

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