使用C#属性来跟踪函数调用、变量和返回值?

2024-06-20

在Python中,我可以使用装饰器来跟踪函数调用、它的变量和返回值。 这是非常容易使用。 我只是想知道 C# 可以做同样的事情吗?

我发现网上有CallTracing Attribute的示例代码。 然而,它并没有显示出我预期的结果。

C# 属性与 python 的装饰器有类似的概念吗?

感谢您 并致以最诚挚的问候!

[AttributeUsage(AttributeTargets.Method | AttributeTargets.ReturnValue |
    AttributeTargets.Property, AllowMultiple = false)]
public class CallTracingAttribute : Attribute
{
    public CallTracingAttribute()
    {

        try
        {
            StackTrace stackTrace = new StackTrace();
            StackFrame stackFrame = stackTrace.GetFrame(1);                

            Trace.TraceInformation("{0}->{1} {2}:{3}",
                stackFrame.GetMethod().ReflectedType.Name,
                stackFrame.GetMethod().Name,
                stackFrame.GetFileName(),
                stackFrame.GetFileLineNumber());

            Debug.WriteLine(string.Format("{0}->{1} {2}:{3}",
                stackFrame.GetMethod().ReflectedType.Name,
                stackFrame.GetMethod().Name,
                stackFrame.GetFileName(),
                stackFrame.GetFileLineNumber()));
        }
        catch
        {
        }
    }
}

class Program
{
    [CallTracing]
    static int Test(int a)
    {
        return 0;
    }

    [CallTracing]
    static void Main(string[] args)
    {
        Test(1);
    }
}

如果您愿意接受某些约束(即从 ContextBoundObject 派生等),.NET 确实支持调用拦截体系结构。您可以在中找到如何执行此操作的完整说明MSDN 杂志文章标题为“通过将自定义服务注入对象的拦截链来解耦组件”。 http://msdn.microsoft.com/en-us/magazine/cc164165.aspx

此外,您可能需要考虑将类抽象为接口,然后通过接口实现转发调用来拦截调用。

最后看一下WCF。它有一个非常明确定义的拦截架构(不要让它的 Web 服务欺骗了您,您可以简单地创建自己的通道传输,这是一个空通道),您可以利用它来完全执行您想要的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用C#属性来跟踪函数调用、变量和返回值? 的相关文章

随机推荐