[英]How do you intercept method calls on a base class using PostSharp?
我想使用 PostSharp 為各種類提供System.Object.ToString
的實現。 我創建了一個從MethodInterceptionAspect
繼承的方面,但是當調用EchoDto.ToString
時,不會調用OnInvoke
方法。
如何在調用ToString
調用OnInvoke
?
[DataContract]
[ImplementJsonToStringAspect()]
public class EchoDto
{
[DataMember]
public string Text { get; set; }
}
[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
public class ImplementJsonToStringAspect : MethodInterceptionAspect
{
public override void OnInvoke(MethodInterceptionArgs args)
{
base.OnInvoke(args); // Never gets called
}
public override bool CompileTimeValidate(MethodBase method)
{
return method.Name == "ToString";
}
}
從InstanceLevelAspect
繼承並使用[IntroduceMember(OverrideAction=MemberOverrideAction.OverrideOrFail)]
裝飾方法。 要在目標對象上引用this
,請使用this.Instance
。
/// <summary>
/// Implements a ToString method on the target class that serializes the members to JSON.
/// </summary>
[Serializable]
public class ImplementJsonToStringAspect : InstanceLevelAspect
{
#region Methods
/// <summary>
/// Provides an implementation of <see cref="System.Object.ToString"/> that serializes the instance's
/// public members to JSON.
/// </summary>
/// <returns></returns>
[IntroduceMember(OverrideAction=MemberOverrideAction.OverrideOrFail)]
public override string ToString()
{
return JsonConvert.SerializeObject(this.Instance);
}
#endregion
}
注意:這需要 PostSharp 的付費版本,因為免費版本不支持InstanceLevelAspect
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.