2011-10-05 2 views
1

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

[ProtoContract] 
    public sealed class Web2Image : WebEntity 
    { 
     [ProtoMember(1009), Validator.Collection(Data = new[] { "jpg", "bmp", "png", "tiff" })] 
     public override string OutputFormat { get; set; } 
} 

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

public class Validator 
    { 

     [Serializable] 
     [Collection(AttributeExclude = true)] 
     [MulticastAttributeUsage(MulticastTargets.Property)] 
     public class Collection : LocationInterceptionAspect 
     { 
      public string[] Data; 

      public override void OnGetValue(LocationInterceptionArgs args) 
      { 

       SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args); 
       /* SiAuto.Main.LogObject("FieldAccessEventArgs " + Reflection.AssemblyHelper.EntryAssembly, args.Binding.ToString());*/ 

       args.ProceedGetValue(); 
       if (args.Value == null) 
       { 
        args.Value = Data[0]; 
        args.ProceedSetValue(); 
       } 

       foreach (var s in Data) 
       { 
        if (args.Value.ToString().ToLower() == s.ToLower()) 
         return; 

       } 

       throw new EngineException(string.Format("Value \"{0}\" is not correct. {1} parameter can accept only these values {2}", args.Value, args.LocationName, string.Join(",", Data))); 

      } 

     } 
} 

ответ

0

Вам необходимо будет реализовать IInstanceScopedAspect. См. http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspx и http://www.sharpcrafters.com/blog/post/Day-10-Aspect-Lifetime-Scope-Part-2.aspx для получения дополнительной информации о времени жизни и сфере охвата аспектов, в том числе о том, как реализовать IInstanceScopedAspect.

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

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

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