2012-09-07 11 views
8

Ich suche eine VB6/COM + Code in C#/COM +Warum ist das C# CreateObject so viel ausführlicher als VB.NET?

jedoch, wo in VB6 oder VB.NET Ich habe zu konvertieren:

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

In C# scheint es, wie ich folgendes tun:

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); 

gibt es eine Möglichkeit C# zu bekommen nicht die InvokeMember Funktion zu nutzen zu haben, und rufen Sie die Funktion direkt?

+4

Kurze Antwort: Weil VB von Anfang an so konzipiert wurde COM-Objekte für das Konsumieren, während C# nicht. – phoog

Antwort

11

Gibt es einen Weg, um C# verwenden nicht die InvokeMember Funktion nutzen zu haben und nur die Funktion direkt aufrufen?

Ja, wie von C# 4 mit dynamic typing:

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

Es ist immer noch ausführlicher im CreateObject Teil, aber man kann immer, dass in einem Methodenaufruf einpacken, wenn man will. (Es kann sein ein bestehendes Gespräch Ich bin mir nicht bewusst, oder Sie könnten versuchen, was VB zu finden, ist in diesem Fall nennen -. Ich weiß nicht, die Details Server.CreateObject)

Beachten Sie, dass dynamische Typisierung ist reicher als nur Reflexion einfacher zu machen, aber es tut das sicher. Hinter den Kulissen wird die gleiche Sache in beiden Fällen passieren - es wird immer noch nicht so schnell wie statische Bindung, aber es ist fast sicher schnell genug.

6

Ja, können Sie das dynamic Stichwort

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

Wenn Sie Zugriff auf den eigentlichen Klassentyp haben, können Sie es tut, wie folgt:

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