如何将没有接口的泛型类型传递给Of T函数

时间:2009-06-08 13:40:35

标签: vb.net generics reflection types

我有以下代码可以正常使用

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

因此,使用上述箭头显示的部分必须以某种方式动态提供。

3 个答案:

答案 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 });

因为它涉及反射但它不会很快......但我认为在这种情况下这不是问题。