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