У меня есть следующая функция, которая кажется немного странной.Может быть, идиома или шаблон, который я копирую, уже встроен.Функция должна лениво возвращать загруженные сборки и их ссылки.При каждом вызове он должен возвращать полный список обнаруженных сборок, а также вновь «обнаруженные» сборки до тех пор, пока итерация не остановится.Есть ли лучший способ написать это?
let discoverAssemblies =
let known = HashSet()
let rec discover (assemblies:array<Assembly>) =
seq {
for asm in assemblies do
if known.Add(asm) then
yield asm
let refs =
asm.GetReferencedAssemblies()
|> Array.map (fun asmName -> Assembly.Load(asmName))
yield! discover refs
}
fun () ->
seq {
for asm in known do yield asm
yield! AppDomain.CurrentDomain.GetAssemblies() |> discover
}
Кстати, я не проверял это, и есть большая вероятность, что он глючит.Таким образом, полагайтесь на описание больше, чем на код.
РЕДАКТИРОВАТЬ
Кажется, LazyList
или Seq.cache
подойдет, но GetAssemblies()
недетерминированОднако, похоже, что после загрузки всех сборок, на которые есть ссылки, GetAssemblies()
вернет то же самое, что и реверсивный обход GetReferencedAssemblies()
.Кто-нибудь может это подтвердить?В этом случае возможны более простые решения.