Примечание: хотя пример кода написан на F #, я специально не ищу ответ F #, но для вызовов. net, которые мне нужно сделать, поэтому ответ на C# или F # подойдет.
У меня есть система, в которой есть команды для чат-бота, разбросанные по разным частям кода. Я нахожу и регистрирую их все через отражение, используя этот код:
member private this.RegisterCommands() =
let t = typeof<IBotCommands>
t.Assembly.GetTypes()
|> Seq.filter (fun x -> x.GetInterface(t.Name) <> null)
|> Seq.iter (fun x ->
(
let i = (Activator.CreateInstance(x)) :?> IBotCommands
botCommands.[i.Name()] <- i
i.Initialize(this)
)
)
Это в F #, но я думаю, что вызовы методов выдают то, что он делает, если вы более знакомы с C#.
Итак, я делаю Assembly.GetTypes, сохраняйте те, где GetInterface имеет имя интерфейса, которое я ищу, и затем я создаю их экземпляр.
Это работает хорошо, но только в пределах своей сборки. У меня вопрос, как я могу расширить это на все сборки, загруженные приложением (но системные, чтобы не тратить время)?