Вы не можете сделать это из коробки. Вам нужно написать собственный код выполнения, который использует отражение, чтобы выяснить, что и как выполнять. Ниже я поделюсь простым примером.
Во-первых, вам нужны атрибуты для описания типа методов.
class InitMethodAttribute : Attribute
{
public InitMethodAttribute():base()
{ }
};
class CleanupMethodAttribute : Attribute
{
public CleanupMethodAttribute() : base()
{ }
};
class RunMethodAttribute : Attribute
{
public RunMethodAttribute() : base()
{ }
};
Мы будем использовать это на примере класса. Обратите внимание, что все методы в этом примере являются частными. Они могут быть вызваны через отражение. Также обратите внимание, что для простоты они не имеют параметров и ничего не возвращают. Вы можете обойти этот пример и изменить его на поддержку параметров.
class Example
{
[InitMethod]
private void Init()
{
Console.WriteLine("Initializing...");
}
[InitMethod]
private void InitMore()
{
Console.WriteLine("More initializing...");
}
[RunMethod]
private void Run()
{
Console.WriteLine("Running...");
}
[CleanupMethod]
private void Cleanup()
{
Console.WriteLine("Cleaning up...");
}
}
Следующий класс, называемый executor, берет объект и смотрит на его тип, идентифицируя методы и просматривая их атрибуты. В конце концов, если атрибут RunMethod
найден в каком-либо методе, метод выполняется. До этого выполняются все декорированные методы InitMethod
, а после него все декорированные CleanupMethod
методы.
static class Executor
{
public static void Run(object obj)
{
var type = obj.GetType();
var methods = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
var initMethods = new List<MethodInfo>();
var cleanMethods = new List<MethodInfo>();
foreach (var method in methods)
{
var initattrs = method.GetCustomAttributes(typeof(InitMethodAttribute));
var cleanattrs = method.GetCustomAttributes(typeof(CleanupMethodAttribute));
if (initattrs != null && initattrs.Count() > 0)
initMethods.Add(method);
else if (cleanattrs != null && cleanattrs.Count() > 0)
cleanMethods.Add(method);
}
foreach (var method in methods)
{
var runattrs = method.GetCustomAttributes(typeof(RunMethodAttribute));
if(runattrs != null)
{
var runattr = runattrs.FirstOrDefault();
if(runattr != null)
{
foreach (var m in initMethods)
m.Invoke(obj, null);
method.Invoke(obj, null);
foreach (var m in cleanMethods)
m.Invoke(obj, null);
}
}
}
}
}
Следующая программа использует все это:
class Program
{
static void Main(string[] args)
{
var example = new Example();
Executor.Run(example);
}
}
Вывод:
Initializing...
More initializing...
Running...
Cleaning up...