我期待将一些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功能,只需要直接调用该函数的方法吗?
有没有让C#中没有使用InvokeMember功能,只需要直接调用该函数的方法吗?
是的,为C#4 动态类型 :
dynamic admin = Activator.CreateInstance(Type.GetTypeFromProgID("AppAdmin.GUI"));
admin.ShowPortal();
它仍然在更详细的CreateObject
的一部分,但你总是可以换行了一个方法调用,如果你想要的。 (有可能是现有的电话,我不知道的,或者你可以尝试找到任何VB在这种情况下,呼吁-我不知道的细节Server.CreateObject
)。
需要注意的是动态类型不仅仅是使反射更简单更丰富,但它确实做到这一点。 在幕后,这样的事情会在两种情况下发生,虽然-它仍然不会是一样快,静态绑定,但它几乎肯定不够快。
是的,你可以使用dynamic
关键字
dynamic objAdmin = System.Activator.CreateInstance(objAdminType);
objAdmin.ShowPortal();
如果你有机会到实际的类类型,则可以按如下做到这一点:
AppAdminClass m_objAdmin = (AppAdminClass)System.Activator.CreateInstance(typeof(AppAdminClass));
m_objAdmin.ShowPortal();