private static void AssertNotNullAndAreEqual<T, TK>(T expected, TK actual)
{
Assert.IsNotNull(expected);
Assert.AreEqual(expected, actual);
}
我可以这样调用它:
AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName);
有什么简单的方法可以让我从这个方法中知道预期对象的“FirstName”文本?
我需要它用于记录目的并从此方法中给出正确的错误消息。
C# 调用者信息在这里没有帮助。
最佳答案
我会重新考虑这种方法,因为这可能会在某些时候产生反作用 - 但如果您真的热衷于获得某种程度的自动化,您可以试试这个:
private static void AssertNotNullAndAreEqual<T, TK>(Expression<Func<T>> expected,
Expression<Func<TK>> actual)
{
var memberExpression = expected.Body as MemberExpression;
if (memberExpression != null)
{
var expectedMemberName = memberExpression.Member.Name;
var expectedVal = expected.Compile()();
var actualVal = actual.Compile()();
Assert.IsNotNull(expectedVal);
Assert.AreEqual(expectedVal, actualVal);
//...
}
}
现在您的调用必须如下所示:
AssertNotNullAndAreEqual(() => expected.FirstName, () => actual.FirstName);
更多注意事项
- 很多东西直到编译时才会被检查(幸运的是类型安全被保留)。编写能够正确编译但在运行时失败的调用很容易。
- 如本文所写,它不适用于变量 - 但如果您决定采用这种方式,它会很容易编写。
请自行决定使用:)
关于c# - 如何知道传递给方法的变量/属性名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20681645/