2017-02-10 8 views
1

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

[return: CustomAttribute] 
public string Do(string param1) 
{ 
    // do something 
} 

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

ответ

2

C# не содержит синтаксиса, связанного с AOP. [return: CustomAttribute] добавляет информацию о метаданных для возврата типа. Это совсем не то, чего вы ожидаете. Чтобы использовать AOP, вам необходимо либо:

  • Используйте внешнюю библиотеку, разработанную специально для обеспечения АОП. Вот nice list таких библиотек.
  • Если вы используете контейнер, он может поддерживать АОП. Например, вот a link в документацию StructureMap AOP.
  • Вы можете попытаться реализовать функции AOP самостоятельно, но это довольно сложно (особенно, если вы заботитесь о производительности).
+0

Я был готов получить этот ответ ... мои исследования уже сказали мне, что .net и C# не готов к АОПУ –

+1

Ну, это не совсем верно. :) .NET и C# отлично справляются с AOP. Нет синтаксиса, специально предназначенного для использования аспектов, но есть много библиотек, которые предоставляют такие возможности. Я отредактировал свой ответ, чтобы включить [эту ссылку] (http://stackoverflow.com/questions/633710/what-is-the-best-implementation-for-aop-in-net). –

0

Вот способ сделать что-то некрасивое, что дает вам результат, но это хорошо ... уродливо.

public class UglySolution 
{ 
    private static string _changedString; 

    private class CustomAttribute : Attribute 
    { 
     public CustomAttribute() 
     { 
      _changedString = "New"; 
     } 
    } 

    public class SomeClass 
    { 
     public SomeClass() 
     { 
      _changedString = "Original"; 
     } 

     [Custom] 
     public string GetValue() 
     { 
      typeof(SomeClass).GetMethod("GetValue").GetCustomAttributes(true).OfType<CustomAttribute>().First(); 
      return _changedString; 
     } 
    } 
}