Как правильно оптимизировать этот код? У меня много подобных фрагментов. Как видите, алгоритм абсолютно одинаков, но просто происходит обращение к РАЗНЫМ свойствам обьектов.
'Рекурсивный обход дерева в поисках нужного тега
Private Function GetNodesForTag(ByVal StartNode As System.Web.SiteMapNode, ByVal TableIndex As Integer) As System.Web.SiteMapNode
If StartNode.ResourceKey = TableIndex Then Return StartNode
If StartNode.ChildNodes IsNot Nothing Then
For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
If X.ResourceKey = TableIndex Then
Return X
Else
GetNodesForTag(X, TableIndex)
End If
Next
End If
End Function
'Рекурсивный обход дерева в поисках нужного URL
Private Function GetNodesForURL(ByVal StartNode As System.Web.SiteMapNode, ByVal URL As String) As System.Web.SiteMapNode
If StartNode.URL = URL Then Return StartNode
If StartNode.ChildNodes IsNot Nothing Then
For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
If X.Url = URL Then
Return X
Else
GetNodesForURL(X, URL)
End If
Next
End If
End Function
Я начинал программировать еще 29 лет назад на великолепном языке - макроассемблер. И в нем я бы реализовал этот единый алгоритм так:
Search Macro &Pref, &Property, &Type
Private Function GetNodesFor&PrefL(ByVal StartNode As System.Web.SiteMapNode, ByVal URL As &Type) As System.Web.SiteMapNode
If StartNode.&Property = URL Then Return StartNode
If StartNode.ChildNodes IsNot Nothing Then
For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
If X.&Property = URL Then
Return X
Else
GetNodesFor&Pref(X, URL)
End If
Next
End If
End Function
End Macro
потом породил бы эти обе функции вот так:
Search "Tag", "ResourceKey", "Integer"
Search "URL", "URL", "String"
А как именно написать сегодня из такой функции Дженерик, который бы реализовал ЕДИНЫЙ алгоритм со строгой проверкой типа?
Теперь, на этапе компиляции это уже сделать невозможно (ну без невыносимого гимороя).
Ну хотя бы на этапе исполнения как ИМЕННО это сделать? Поскажите, плиз.