Выполнить метод перед всеми методами класса
Возможно ли это сделать в С# 3 или 4? Может быть, с некоторым отражением?
class Magic
{
[RunBeforeAll]
public void BaseMethod()
{
}
//runs BaseMethod before being executed
public void Method1()
{
}
//runs BaseMethod before being executed
public void Method2()
{
}
}
ИЗМЕНИТЬ
Для этого есть альтернативное решение, сделайте Magic
singleton и поместите свой код в getter статического экземпляра. Вот что я сделал:
public class Magic
{
private static Magic magic = new Magic();
public static Magic Instance
{
get
{
magic.BaseMethod();
return magic;
}
}
public void BaseMethod()
{
}
//runs BaseMethod before being executed
public void Method1()
{
}
//runs BaseMethod before being executed
public void Method2()
{
}
}
Ответы
Ответ 1
Для этого есть альтернативное решение, сделайте Magic singleton и поместите свой код на getter статического экземпляра. Это то, что я сделал.
public class Magic{
private static Magic magic;
public static Magic Instance{
get
{
BaseMethod();
return magic;
}
}
public void BaseMethod(){
}
//runs BaseMethod before being executed
public void Method1(){
}
//runs BaseMethod before being executed
public void Method2(){
}
}
Ответ 2
Вы не можете сделать это автоматически на С# - вы, вероятно, должны смотреть на AOP, например. с PostSharp.
Ответ 3
Что вы можете сделать с AOP - некоторые ссылки на .NET С# AOP frameworks:
Ответ 4
Просто чтобы понять, почему следующая реализация не будет работать:
public class Magic{
private static Magic magic = new Magic();
public static Magic Instance{
get
{
magic.BaseMethod();
return magic;
}
}
public void BaseMethod(){
}
//runs BaseMethod before being executed
public void Method1(){
}
//runs BaseMethod before being executed
public void Method2(){
}
}
если вы хотите просто сохранить объект Magic
, метод будет случайно вызван:
Magic m = Magic.Instance; //this will trigger unwanted call on BaseMethod
а также если вы хотите вызвать BaseMethod
, он будет вызываться дважды:
Magic.Instance.BaseMethod(); //two calls of the BaseMethod
который, конечно, имеет обходное решение, чтобы вернуть нежелательные объекты, используя get:
var unused = Magic.Instance;
Только для подведения итогов: это невозможно (по крайней мере пока) на С#.