【问题标题】:Convert a String to Call a Public Class ASP.NET VB转换字符串以调用公共类 ASP.NET VB
【发布时间】:2014-07-14 16:14:36
【问题描述】:

我已经查看了这个链接,但我似乎无法让它工作

Creating a New control of the same type as another control that is already declared

我也通过搜索尝试过:

Dim ClassToCreate As String = "TestClass1.CountItems"

Dim myInstance = Activator.CreateInstance(Type.GetType(ClassToCreate), True)

错误是:

"Value cannot be null.
Parameter name: type"

问题: 我有多个类,并想更改基于字符串调用的类。 (例子当然不正确)

Dim strClassToCall = "TestClass1.CountItems"

'然后将字符串转换为实际的类,这样就可以这样调用它:

Dim strResult = TestClass1.CountItems(strSomeParameter)

感谢您的帮助!

【问题讨论】:

  • 我建议不要使用反射......为什么不让所有类都实现一个接口,这样你就可以调用接口的方法而不是试图乱用反射?
  • 谢谢安德烈,只是为了确认一下,这个接口将是它自己的一个类,然后会从 CASE 或 ELSEIF 类型的东西中调用该类??
  • 您不需要 Case 或 If 语句。由于您的所有类都将在您的接口中实现该方法,因此您可以调用它。假设您有一个名为 ICommunicate 的接口(接口通常以 I 开头)。这个接口只有一个方法:Talk()。然后,您创建实现此接口的类Dog 和类Person。由于它们都实现了ICommunicate,因此您可以在其中任何一个上调用 Talk() 方法。 (您可以将ICommunicate 对象作为函数的参数接收,而不是PersonDog,因此您可以独立于类调用Talk()
  • 根据您的示例,TestClass1.CountItems 似乎是一个函数,而不是一个类。
  • Type.GetType(ClassName) 和 classType.InvokeMember

标签: asp.net vb.net


【解决方案1】:

根据错误消息,听起来您的Type 未正确加载,因为它为空。假设您将有效的Type 传递给激活器,您正在使用的方法将创建您需要的对象。类型是否来自引用的 DLL?

如果仅使用字符串表示不起作用,您可以使用以下方法获取类型。这使用反射来查找类型:

// Sorry this is c# :)
System.Reflection.Assembly pAssembly = System.Reflection.Assembly.Load(
    System.Reflection.Assembly.GetExecutingAssembly().
    GetReferencedAssemblies().Single(a => a.Name.Equals("YourNamespace.ClassName")));
yourType = pAssembly.GetTypes().First(c => (c.FullName != null) &&
    c.FullName.Equals("YourNamespace.ClassName"));
var yourObject = Activator.CreateInstance(yourType, true);

【讨论】:

  • 谢谢 Kelsy,我将首先从 Andrei 的观点开始(抱歉),但我也将测试你的观点
  • @JTT2 如果您不处理有更多不同类型的对象尝试使用的复杂场景,那么接口绝对是您的最佳选择。我认为这将是导致您需要走这条路的第一种方法,因为它要复杂得多:)
  • 我其实是在尝试使用
  • Type.GetType(ClassName) 和 classType.InvokeMember
  • 虽然没有成功,所以我要为此提出一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2016-06-04
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多