我的功能如下:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of FileInfo)
...
End Function
我想添加一个带有SAME参数 Type 但是更改返回 Type 的重载,如下所示:
Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of String)
...
End Function
可以在不更改param1
类型的情况下完成吗?我考虑过在Function MyFunction(Of T)(ByVal param1 As String) As Ienumerable(Of T)
这两个函数上添加 Type 参数,以期如下所示:
Dim collection As IEnumerable(Of String) = MyFunction(Of String)("")
Dim collection As IEnumerable(Of FileInfo) = MyFunction(Of FileInfo)("")
但要做到这一点,我还需要更改param1
值的类型,我也看到了通过人为错误传递不同类型参数的缺点,例如调用函数作为{ {1}}然后在函数内添加意外类型参数的错误处理......似乎不是一种干净/安全的方法。
所以我明确地希望将Return MyFunction(Of Integer)("")
用作 String ,相同的函数名,并在每个函数上返回不同的枚举,我完全知道一个返回<的函数strong>对象或者使用类型参数以这种方式搞乱,我不认为这是一个干净的解决方案:
param1
哪种方法可以解决这个问题呢? ......这对我暴露的要求真的可行吗?
答案 0 :(得分:1)
在这种情况下, de jure / facto 只是简单地重命名每个函数以反映返回类型。实际上,这是我推荐的唯一方法。
Public Shared Iterator Function GetStrings(ByVal param1 As String) As IEnumerable(Of String)
End Function
Public Shared Iterator Function GetFiles(ByVal param1 As String) As IEnumerable(Of FileInfo)
End Function
选项1
但如果你能接受一些含糊不清的警告,那么可以选择创建一个实现IEnumerable(T)的自定义返回类型。
Public Class MyFunctionIterator
Implements IEnumerable, IEnumerable(Of String), IEnumerable(Of FileInfo)
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Iterator Function GetStrings() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
For Each item As String In {"a", "b", "c", "d"}
Yield item
Next
End Function
Public Iterator Function GetFiles() As IEnumerator(Of FileInfo) Implements IEnumerable(Of FileInfo).GetEnumerator
For Each name As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
Yield New FileInfo(name)
Next
End Function
Private Iterator Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Throw New NotSupportedException()
End Function
End Class
的
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionIterator
Return New MyFunctionIterator(param1)
End Function
<子>的用法强> 子>
Dim collection1 As IEnumerable(Of String) = MyFunction("...")
Dim collection2 As IEnumerable(Of FileInfo) = MyFunction("...")
For Each s In collection1
Debug.Write(s & ", ")
Next
Debug.WriteLine("")
For Each fi In collection2
Debug.Write(fi.Name & ", ")
Next
a,b,c,d,
desktop.ini,file1.txt,file2.txt,file3.txt,
选项2
如果您 使用接口,则另一个选项是创建自定义返回类型并定义conversion operators。
Public Class MyFunctionResult
Friend Sub New(param1 As String)
Me.param1 = param1
End Sub
Private param1 As String
Public Function GetString() As String
Return ("Hello " & Me.param1 & "!")
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As String
Return value.GetString()
End Operator
Public Function GetFile() As FileInfo
Return New FileInfo(Me.param1)
End Function
Public Shared Widening Operator CType(value As MyFunctionResult) As FileInfo
Return value.GetFile()
End Operator
End Class
的
Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionResult
Return New MyFunctionResult(param1)
End Function
<子>的用法强> 子>
Dim s As String = MyFunction("Bjørn")
Dim fi As FileInfo = MyFunction("C:\Users\bjorn\Documents\file1.txt")
Debug.WriteLine(s)
Debug.WriteLine(fi.Name)
你好Bjørn!
FILE1.TXT