Supongamos que tenemos un conjunto de clases que tienen un método main o se puede llamar como quiera y nosotros queremos pasar por parámetro el nombre de la clase y si no pasamos ningun nombre se ejecutan todos los métodos:
using System;
using System.Linq;
using System.Reflection;
namespace Example
{
class Program
{
static void Main(string[] args)
{
if (args[0] != null)
{
Run(args[0]);
}
else
{
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetTypes())
.Where(type => "Example".Equals(type.Namespace)
&& !"Program".Equals(type.Name)).OrderBy(type => type.Name);
foreach (var type in types)
{
Run("Example."+type.Name);
}
}
}
private static void Run(string className)
{
var classType = Type.GetType(className);
var declaredMethods = (classType as System.Reflection.TypeInfo)?.DeclaredMethods;
if (declaredMethods == null) return;
var mainMethod = declaredMethods.FirstOrDefault(method => method.Name == "Main");
if (mainMethod == null)
{
return;
}
mainMethod.Invoke(null, null);
}
}
}
El método Run corre el metodo main de la clase pasada por parametros. Si no tiene este método, no hace nada.
Listo!!