我有以下代码可以正常使用
MsgBox(AddSomething(Of String)("Hello", "World"))
Public Function AddSomething(Of T)(ByVal FirstValue As T, ByVal SecondValue As T) As String
Return FirstValue.ToString + SecondValue.ToString
End Function
现在我们正在重新设计应用程序以使用将通过XML提供的不同类型的参数
<SomeValues>
<Add Param1="Somedata" Param2="SomeData" MyType="String"/>
<Add Param1="Somedata" Param2="SomeData" MyType="MyBusinessObject"/>
</SomeValues>
如果我尝试提供以下内容,则会显示错误,因为仅接受类型
''''Get DetailsFromXml --- MyType,Param1,Param2
MsgBox(AddSomething(Of Type.GetType(MyType))(Param1,Param2))
如何解决这个问题。
修改
上面的例子是为了简化问题。实际问题如下 我正在使用P&amp; P的SCSF。 以下是必须为每个视图编写的每个视图代码
Private Sub tsStudentTableMenuClick()
Dim _StudentTableListView As StudentListView
_StudentTableListView = ShowViewInWorkspace(Of StudentListView)("StudentTable List", WorkspaceNames.RightWorkspace)
_StudentTableListView.Show()
End Sub
现在我想动态显示视图。
Public Sub ShowModalView(ByVal ViewName As String)
Dim _MasterListView As >>>EmployeeListView<<<<
_MasterListView = ShowViewInWorkspace(Of >>>EmployeeListView<<<)("Employee List", WorkspaceNames.RightWorkspace)
_MasterListView.Show()
End Sub
因此,使用上述箭头显示的部分必须以某种方式动态提供。
答案 0 :(得分:3)
泛型的要点是在编译时提供额外的信息。您只能在执行时间获得该信息。
当您使用VB时,可以能够通过关闭Option Strict
来实现延迟绑定。我不知道你是否可以只为一小段代码关闭它 - 这将是理想的,真的。
否则,如果你真的无法在编译时获取信息,你需要用反射调用它 - 获取方法的通用“蓝图”,调用MethodInfo.MakeGenericMethod
然后调用它
我认为真正的方法有点复杂吗?毕竟,你可以在任何事情上致电ToString()
......
(使用.NET 4.0可能会有更多选项。您当然可以在C#4.0中使用dynamic
,我相信VB10将提供相同类型的功能。)
答案 1 :(得分:2)
在.Net泛型中,您必须能够在编译时解析为特定类型,以便它可以生成适当的代码。只要您使用反射,就可以在运行时解析类型。
在这种情况下,您始终只是调用.ToString()
方法。如果这确实是您的所有代码,那么您只需将参数类型更改为Object
,而不是使用通用方法。如果它有点复杂,你也可以尝试让你的参数实现你将定义的一些通用接口。
答案 2 :(得分:2)
如果你所做的只是ToString
,那么制作参数object
将以最简单的方式解决问题。否则,您将不得不在运行时绑定类型,在C#中看起来像:
System.Reflection.MethodInfo mi = GetType().GetMethod("AddSomething");
mi = mi.MakeGenericMethod(Type.GetType(MyType));
object result = mi.Invoke(this, new object[] { Param1, Param2 });
因为它涉及反射但它不会很快......但我认为在这种情况下这不是问题。