private static void AssertNotNullAndAreEqual<T, TK>(T expected, TK actual)
{
Assert.IsNotNull(expected);
Assert.AreEqual(expected, actual);
}
我可以使用:
来调用它AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName);
有没有简单的方法可以从这个方法中知道预期对象的“FirstName”文本?
我需要它用于记录目的,并在此方法中提供正确的错误消息。
C#来电者信息在这里没有帮助。
答案 0 :(得分:1)
我会重新考虑这种方法,因为这可能会在某些时候反过来 - 但如果你真的热衷于获得某种程度的自动化,你可以试试这个:
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);
更多警告
请自行决定使用:)
答案 1 :(得分:0)
如果您将ToString()
用于其他目的(我假设您是),您可以定义一个接口并将其用作AssertNotNullAndAreEqual(...)
上的类型约束,或者交替检查是否传递给AssertNotNullAndAreEqual(...)
的对象具有接口。
您定义了一个界面,比如IDebugString
,它有一个ToDebugString()
方法,然后您调用它来检索要记录的信息。