2017-01-25 14 views
1

Мой аспект:PostSharp - args.ReturnValye = default (T) -> T = метод возврата типа, как?

[Serializable] 
class FlowController : OnMethodBoundaryAspect 
{ 
    [ThreadStatic] 
    private static bool logging; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     if (logging) 
      return; 

     try 
     { 
      logging = true; 
      if (ProgramState.State() == false) 
      { 
       args.ReturnValue = ""; // WHAT DO I SET HERE? 
       args.FlowBehavior = FlowBehavior.Return; 
      } 
     } 
     finally 
     { 
      logging = false; 
     } 
    } 
} 

В основном в() метод проверки ProgramState.State, если программа работает (правда), приостановлена ​​(петли, а isPaused == верно), остановился (ложь), то это должно контролировать, если методы могут выполняться или нет (в основном, функция остановки паузы/возобновления)

Но иногда я получаю ненулевые ссылки при возврате из метода.

Мне интересно узнать, как установить тип возвращаемого значения для возвращаемого типа по умолчанию.

ответ

0

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

[Serializable] 
[MulticastAttributeUsage(MulticastTargets.Method)] 
public class FlowControllerAttribute : MethodLevelAspect, IAspectProvider 
{ 
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     MethodInfo method = (MethodInfo) targetElement; 

     Type returnType = method.ReturnType == typeof(void) 
      ? typeof(object) 
      : method.ReturnType; 

     IAspect aspect = (IAspect) Activator.CreateInstance(typeof(FlowControllerAspect<>).MakeGenericType(returnType)); 

     yield return new AspectInstance(targetElement, aspect); 
    } 
} 

[Serializable] 
public class FlowControllerAspect<T> : IOnMethodBoundaryAspect 
{ 
    public void RuntimeInitialize(MethodBase method) 
    { 
    } 

    public void OnEntry(MethodExecutionArgs args) 
    { 
     args.ReturnValue = default(T); 
     args.FlowBehavior = FlowBehavior.Return; 
    } 

    public void OnExit(MethodExecutionArgs args) 
    { 
    } 

    public void OnSuccess(MethodExecutionArgs args) 
    { 
    } 

    public void OnException(MethodExecutionArgs args) 
    { 
    } 
} 

// Usage: 
[FlowController] 
public int Method() 
{ 
    // ... 
} 
+0

Спасибо! но ... Не будет ли возврат по умолчанию (T) нулями? –

+0

Ну, значение по умолчанию (T) является «нулевым» значением для данного типа T, например. null для ссылочных типов, 0 для int и т. д. См. https://msdn.microsoft.com/en-us/library/xwth0h0d.aspx – AlexD

 Смежные вопросы

  • Нет связанных вопросов^_^