PostSharp的新功能---我现在正在尝试NuGet版本,并且我试图在AuthoriseAttribute OnEntry方法中理解agrs.Instance值为null的wny。我正在尝试实现取决于对象值的作者身份,例如已归档的客户无法提高信用额度。我正在其他特定于规则的类中实现规则。
public class Program
{
static void Main(string[] args)
{
var c = new Customer();
c.RaiseCreditLimit(100000);
c.Error(00);
}
}
public class Customer
{
[AuthorizeActivity]
public void RaiseCreditLimit(int newValue)
{
}
[AuthorizeActivity]
public void Error(int newValue)
{
}
}
[Serializable]
public class AuthorizeActivityAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionArgs args)
{
//
//Why is args.Instance null???????????
//
if (args.Method.Name == "RaiseCreditLimit")
{
Debug.WriteLine(args.Method.Name + " started");
}
else
{
throw new Exception("Crap");
}
}
public override void OnExit(MethodExecutionArgs args)
{
Debug.WriteLine(args.Method.Name + " finished");
}
}
答案 0 :(得分:6)
答案是因为你没有在你的方面使用它。这是一个优化。如果您在方面使用它,那么它将被设置。将您的方面更改为使用实例,它将在那里。
public override void OnEntry(MethodExecutionArgs args)
{
//
//Why is args.Instance null???????????
//
if (args.Method.Name == "RaiseCreditLimit")
{
Debug.WriteLine(args.Instance.GetType().Name);
Debug.WriteLine(args.Method.Name + " started");
}
else
{
throw new Exception("Crap");
}
}
有关详细信息,请查看此文章,了解PostSharp还有哪些优化代码http://programmersunlimited.wordpress.com/2011/03/23/postsharp-weaving-community-vs-professional-reasons-to-get-a-professional-license/