我有一个没有指定返回类型的函数,该函数根据枚举type
的输入参数返回通用List(Of T),因此:
Public Function GetTypeList(type as TypeListEnum)
Select Case type
Case TypeListEnum.A
'create result As List(Of A)
Return result
Case TypeListEnum.B
'create result As List(Of B)
Return result
...etc.
Case Else
Return Nothing
End Select
End Function
用于创建结果的代码行在每个块中都是相同的(除了用于定义要返回哪种列表类型的部分外),因此我认为如果我能以某种方式指定T将是什么会很好,而不是将这些几乎相同的代码块放在多个case块中。
有什么办法吗?
如果没有的话,还有另一种(也许是更好的)方法可以根据输入参数返回不同的泛型列表?
答案 0 :(得分:2)
您可以提供期望的类型作为对该函数的一般约束
Public Function GetList(Of T)() AS List(Of T)
Select GetType(T)
Case GetType(First)
Return New List(Of First) From { New First() }.Cast(Of T)()
Case GetType(Second)
Return New List(Of Second) From { New Second() }.Cast(Of T)()
Case Else
Return New List(Of T)()
End Select
End Function
与使用专用枚举相比,该方法的使用更具可读性。
Dim myList As List(Of First) = GetList(Of First)()
Dim myList As List(Of Second) = GetList(Of Second)()
请注意,您需要将结果列表显式转换为通用列表List(Of T)
。
在您的特殊情况下,您可能会遇到一些通用约束,可用于泛型类型。
此外,除非您想为未配置的类型引发异常,否则我建议对您的方法的使用者好一些,并返回一个空列表,而不是Nothing
。
答案 1 :(得分:1)
嗯,枚举值和数据类型实际上并没有什么共同之处。没有一种“内置”的方式可以从一个方向过渡到另一个方向。因此,无论如何,您都需要一种映射,上面写着“对于这个枚举值,采用这种类型”。
一种方法是使用switch语句。我实际上很喜欢它,并且我认为它也会有很好的表现。可读性也非常好-您可以立即查看哪个枚举值映射到哪种类型。
或者,您可以制作某种Dictionary
来将枚举值映射到Type
。您将没有开关,但是需要使用Reflection创建实例。那会慢一些。
已添加
:如果您可以按照Fabio's answer更改函数签名,则可以真正改善:
Public Function GetList(Of T)() AS List(Of T)
Return New List(Of T)()
End Function
这将更快,更容易阅读。但是,此时您必须问-将其放在单独的函数中到底有什么意义?为什么不直接在您需要的地方致电New List(Of T)()
?
答案 2 :(得分:1)