Я хочу предоставить реализацию System.Object.ToString для различных классов с помощью PostSharp. Я создал аспект, наследующий от MethodInterceptionAspect, но метод OnInvoke не вызывается, когда происходит вызов EchoDto.ToString.
Как я могу вызвать OnInvoke при вызове ToString?
[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";
}
}
Ответ 1 · рейтинг 2 · John Mills
Унаследуйте от 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 не поддерживается бесплатной версией.