PostSharp方面每个实例只调用一次

时间:2011-10-05 06:38:18

标签: 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)));

            }

        }
}

1 个答案:

答案 0 :(得分:0)

您需要实施IInstanceScopedAspect。有关方面的生命周期和范围(包括如何实施IInstanceScopedAspect)的详情,请参阅http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspxhttp://www.sharpcrafters.com/blog/post/Day-10-Aspect-Lifetime-Scope-Part-2.aspx

这将为您提供每个实例方面(因为现在每个类型只有一次)。

就检查而言,你可以设置一个开关(如果为true,否则退出,检查)或检查它是否为空(或其他一些初始值)。

相关问题