gpt4 book ai didi

c# - 有没有办法检测方法中调用的内容?

转载 作者:行者123 更新时间:2023-11-30 22:09:29 25 4
gpt4 key购买 nike

在 C# 中,当我调用一个方法时,我希望能够检测它是否会(或可能)调用具有特定属性的东西。

例如,当调用 TheProgram.Run() 时,我想知道它会调用一个 MyClass.DoTheWork,它有一个属性 [IsRegistered],它调用一个私有(private)方法 FormatTheResult(),它也有属性[已注册]。

我想了很久,想不出怎么实现。我在想,类似于堆栈跟踪的反转,或者使用属性或方面注册组件,或者可能依赖于 MEF。

这可能吗?

这种检测可能发生在编译时或运行时,但理想情况下是在执行具有该属性的方法之前。

最佳答案

模拟框架可以做到这一点。它对行为测试很有用。

例如,给定此设置:

public class Calculator {
private IHelpers _helperMethods;

public Calculator(IHelpers helper) {
_helperMethods = helper;
}

public int Add(int a, int b) {
if (_helperMethods.AboveZero(a) && _helperMethods.AboveZero(b)) {
return a + b;
}
throw new Exception("Argument not above zero");
}
}

public interface IHelpers {
bool AboveZero(int i);
}

使用 Moq,您可以验证(通过行为单元测试)IHelpers.AboveZero 在调用 Add 方法时被调用,如下所示:

[TestMethod]
public void When_Add_Called_Verify_AboveZero_Called_Too() {
// Arrange
var helperMock = new Mock<IHelpers>();
helperMock.Setup(x => x.AboveZero(It.IsAny<int>())).Returns(true);

var calc = new Calculator(helperMock.Object);

// Act
var result = calc.Add(1, 2);

// Assert
helperMock.Verify(x => x.AboveZero(It.IsAny<int>())); // verify that AboveZero was called.
}

虽然属性是另一回事..

这就是你想要的吗?

(请原谅任何编译器错误..这是手工输入的:/)

关于c# - 有没有办法检测方法中调用的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21542777/

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