2010-12-30 3 views
4

У меня есть метод, который я хотел бы всегда запускать до получения доступа к объекту свойства. Возможно ли это без ручного запуска метода внутри get {}? вот пример того, что я хочу работать.C# Запустите фрагмент кода до того, как свойства будут удалены

private string _someString; 
    private string _someOtherString; 

    public string SomeString 
    { 
     get { return _someString; } 
    } 

    public string SomeOtherString 
    { 
     get { return _someOtherString; } 
    } 

    public void AlwaysRun() 
    { 
     // Code to always run here. 
    } 
+0

Возможный дубликат [Способ применения метода auto property в .Net Framework] (http://stackoverflow.com/questions/4546935/how-to-inject-method-to-auto-property-in-net- framework) –

ответ

5

Это невозможно изначально в среде .NET.

Но это может быть сделано с использованием техники, известной как AOP, ориентированное на аспект программирования. Здесь есть хорошее объяснение: http://www.sharpcrafters.com/aop.net. AOP - все о введении кода до или после вызова метода; это то, что вы хотите сделать. Есть два способа сделать это: во время выполнения или во время компиляции. Путь выполнения создает динамическую динамику, переопределяя виртуальные методы, поэтому для того, чтобы ваши методы были виртуальными, ваши методы становятся виртуальными. Если это время компиляции, изменяется фактический код (или IL).

Прекрасное временное хранилище AOP составляет PostSharp. Для выполнения AOP в режиме исполнения пример структуры может быть Castle DynamicProxy.

+0

+1 Это очень * интересно, я никогда не слышал об этом! – Mehrdad

1

Вы можете сделать это с помощью динамических прокси-серверов, если свойства являются виртуальными. Динамический прокси-сервер будет переопределять геттеры и сеттеры, уведомлять вас о вызове, а затем запускать оригинальный метод. В противном случае скопируйте-вставьте вызов всюду вручную.

+0

Или, если свойства не являются виртуальными, можно использовать инфраструктуру AOP для компиляции, такую ​​как PostSharp. – driis

+0

«В противном случае скопируйте запрос в папку вручную». :) –

+0

@chibacity blech. DRY. –

0

Вы можете использовать инфраструктуру инъекции зависимостей, такую ​​как Unity, Ninject, Castle Windsor и реализовать Interceptor. Задача перехватчика - перехватить вызов к чему-то вроде метода и сделать что-то с ним, например, протоколирование.

Тематические динамические прокси-серверы, которые были применены в Castle Windsor, чтобы перехватить вызовы методов.

Это большая тема для этого формата, но если вам интересно, перейдите в Google ninject и следуйте руководству по нему. Таким образом, большие программные системы объединяются, чтобы быть гибкими и обеспечивать будущие изменения.