gpt4 book ai didi

c# - 如何使用 PostSharp 拦截对基类的方法调用?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:52 26 4
gpt4 key购买 nike

我想使用 PostSharp 为各种类提供 System.Object.ToString 的实现。我已经创建了一个继承自 MethodInterceptionAspect 的方面,但是当调用 EchoDto.ToStringOnInvoke 方法没有被调用。

如何在调用 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

关于c# - 如何使用 PostSharp 拦截对基类的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23049735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com