实现一个 class 来查找 C# 中方法的调用时间

Implement a class to find invocation time of methods in C#

我有以下情况

public interface IPay
{
  void IncreasePay();
  void DecreasePay();
}

public class PayCalculation: IPay
{
  private int Pay;
  public PayCalculation( int Pay)
  {
    Pay = Pay;
  }
  public void IncreasePay()
  {
    Pay++;
  }
  public void DescreasePay()
  {
    Pay--;
  }
}

现在,我想实现一个 class 来打印每个 Increase &DecreasePay 方法调用所需的时间(以毫秒为单位),这应该适合 IPay 的现有客户。

我正在尝试自己使用秒表,但不知道如何在不影响现有客户的情况下 class 实现它...

有人可以帮我写代码....

您可以使用面向方面的方法来实现您自己的属性并将其添加到相关方法中。

[OnTransaction]
public void IncreasePay()
{
    Pay++;
}

[Serializable]
public class OnTransactionAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        Log(DateTime.Now); // or other way such as StopWatch, whatever ...
    }
}

这样,每次调用 IncreasePay() 时您都会收到通知。同样,您可以为 DescreasePay() 创建另一个属性并在其中执行一些逻辑。这里OnMethodBoundaryAspect is an attribute defined in PostSharp,这个属性是免费的class。你当然可以自己做。

请注意,您无需触及 IncreasePay() 或 DescreasePay() 的任何内部逻辑,这非常有用且灵活。

您可以创建一个包装器 class,它也实现了 IPay 并让它捕获所花费的时间。

public class PayWrapper : IPay
{
    private readonly IPay _wrapped;
    public PayWrapper(IPay wrapped)
    {
        if (wrapped == null) throw new ArgumentNullException(nameof(wrapped));
        _wrapped = wrapped;
    }

    public void DecreasePay()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        _wrapped.DecreasePay();
        sw.Stop();
        Console.WriteLine(sw.Elapsed);

    }

    public void IncreasePay()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        _wrapped.IncreasePay();
        sw.Stop();
        Console.WriteLine(sw.Elapsed);
    }
}

然后当 class 获得 IPay 时,它可以像这样使用包装器:

public class ConsumerOfPay
{
    private IPay _pay;
    public ConsumerOfPay(IPay pay)
    {
        _pay = new PayWrapper(pay);
    }
}