Как перехватить статический вызов метода в C # - PullRequest
2 голосов
/ 10 февраля 2010

Я пытаюсь реализовать какое-то Аспектно-ориентированное программирование в C #, где у меня был небольшой успех, но я нашел некоторые важные ограничения.

Одним из таких ограничений является возможность перехвата вызова статического метода. Например, предположим, что у нас есть следующий объект:

public class SampleObject  
{
    public SampleObjectProperty { get; set; }  

    public SampleObject(int anInteger) { this.SampleObjectProperty = anInteger; }

    public int SampleObjectMethod(int aValue) 
    { 
        return aValue + this.SampleObjectProperty; 
    }

    public static string GetPI() { return Math.PI.ToString(); }
}

Звонящий выглядит так:

[Intercept]
public class Caller : ContextBoundObject
{
    static void Main(string[] args)
    {
        SampleObject so = new SampleObject(1); // Intercepted successfully.
        so.SampleObjectProperty;               // Idem.
        so.SampleObjectProperty = 2;           // Idem.
        so.SampleObjectMethod(2);              // Idem.

        // The next call (invocation) executes perfectly, but is not intercepted.
        SampleObject.GetPI(); // NOT INTERCEPTED :(        
    }
}

Имея код, я могу перехватить конструктор, метод экземпляра и свойство (получить и установить), но не статический метод.

Любое предложение или идея о том, как перехватить статический вызов метода?

1 Ответ

4 голосов
/ 10 февраля 2010

Инструменты АОП, которые я видел, используют другие методы для перехвата статических методов. В частности, я имею в виду PostSharp, который изменяет ваш код после компиляции, чтобы вставить необходимые инструкции для перехвата.

См. http://www.postsharp.org/ для получения дополнительной информации.

Перехват с использованием метода ContextBoundObject ограничен только методами экземпляра.

...