Выполнить метод перед всеми методами класса

Возможно ли это сделать в С# 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.

Ответ 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;

Только для подведения итогов: это невозможно (по крайней мере пока) на С#.