为什么是C#创建对象所以比VB.NET更详细?(Why is the C# CreateObject

2019-07-31 10:27发布

我期待将一些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功能,只需要直接调用该函数的方法吗?

Answer 1:

有没有让C#中没有使用InvokeMember功能,只需要直接调用该函数的方法吗?

是的,为C#4 动态类型 :

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

它仍然在更详细的CreateObject的一部分,但你总是可以换行了一个方法调用,如果你想要的。 (有可能是现有的电话,我不知道的,或者你可以尝试找到任何VB在这种情况下,呼吁-我不知道的细节Server.CreateObject )。

需要注意的是动态类型不仅仅是使反射更简单更丰富,但它确实做到这一点。 在幕后,这样的事情会在两种情况下发生,虽然-它仍然不会是一样快,静态绑定,但它几乎肯定不够快。



Answer 2:

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

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


Answer 3:

如果你有机会到实际的类类型,则可以按如下做到这一点:

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


文章来源: Why is the C# CreateObject so much more verbose than VB.NET?
标签: c# vb.net com