Eu tenho várias classes estáticas no namespace mySolution.Macros
, como
static class Indent{
public static void Run(){
// implementation
}
// other helper methods
}
Então, minha pergunta é como será possível chamar esses métodos com o auxílio da reflexão?
Se os métodos NÃO fossem estáticos, eu poderia fazer algo como:
var macroClasses = Assembly.GetExecutingAssembly().GetTypes().Where( x => x.Namespace.ToUpper().Contains("MACRO") );
foreach (var tempClass in macroClasses)
{
var curInsance = Activator.CreateInstance(tempClass);
// I know have an instance of a macro and will be able to run it
// using reflection I will be able to run the method as:
curInsance.GetType().GetMethod("Run").Invoke(curInsance, null);
}
Eu gostaria de manter minhas aulas estáticas. Como poderei fazer algo semelhante com métodos estáticos?
Resumindo , gostaria de chamar todos os métodos Run de todas as classes estáticas que estão no namespace mySolution.Macros.
c#
reflection
dynamic
Tono Nam
fonte
fonte
GetMethod
.BindingFlags.Static
você pode não conseguir obter o método em primeiro lugar ...Você poderia realmente otimizar muito seu código pagando o preço de criar o delegado apenas uma vez (também não há necessidade de instanciar a classe para chamar um método estático). Fiz algo muito semelhante e acabei de armazenar em cache um delegado para o método "Executar" com a ajuda de uma classe auxiliar :-). Se parece com isso:
É MUITO mais rápido assim.
Se sua assinatura de método for diferente de Action, você pode substituir os type-casts e typeof de Action para qualquer um dos tipos genéricos Action e Func necessários, ou declarar seu Delegate e usá-lo. Minha própria implementação usa Func para criar objetos bonitos:
fonte
Eu prefiro a simplicidade ...
Uso...
Mas caso você esteja procurando por algo um pouco mais robusto, incluindo o tratamento de exceções ...
O uso é praticamente o mesmo ...
fonte