Почему C# CreateObject настолько более подробный, чем VB.NET?
Я ищу, чтобы преобразовать некоторый код 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 ответов
есть ли способ заставить 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();