2010-11-10 2 views
1

Есть ли способ написать пользовательский класс, который расширяет класс .NET Attribute, чтобы я мог применить этот класс к методу, а .NET Framework вызывает мой конструктор классов перед выполнением этого метода. Вот пример:.NET Attribute Class Plugging

public class TestAttribute : Attribute 
{ 
    public TestAttribute() 
    { 
     Console.WriteLine("Called"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestMethod(); 
    } 

    [TestAttribute()] 
    public static void TestMethod() 
    { 

    } 

} 

Я хочу, чтобы при вызове TestMethod Framework выполнит конструктор TestAttribute().

ответ

2

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

Вы можете посмотреть PostSharp (теперь переименован в commercial product).

+0

Другой вариант (ASP.NET MVC только) создает подкласс 'ActionFilterAttribute'. См. Пример [здесь] (http://www.davidhayden.com/blog/dave/archive/2008/03/21/ActionFilterAttributeExamplesASPNETMVCFrameworkPreview2.aspx). – rsenna

+0

@rsenna - это очень конкретный пример, который в конечном счете вызван через отражение. –

+0

@Marc Gravell: 1) Вот почему я добавил его как комментарий, а не как ответ. 2) Он выполняет задание (OP хочет добавить поведение во время выполнения к методу, я не думаю, что он/она заботится о деталях реализации). 3) Я дал вам +1, поэтому не жалуйтесь! ;-) – rsenna

1

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

0

Да, возможно, но не как есть.

Вы можете сделать это с помощью Aspect Oriented Programming. PostSharp - это структура, которая позволяет вам это делать; это позволяет вам «переплетать» аспекты в код во время компиляции.

Postsharp

[Serializable] 
public class TestAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation() 
    { 
     Console.WriteLine ("TestAttribute called"); 
     base.OnInvocation(); 
    } 
}