如何知道传递给Method的变量/属性名?

时间:2013-12-19 12:20:36

标签: c# .net unit-testing

private static void AssertNotNullAndAreEqual<T, TK>(T expected, TK actual)
{
            Assert.IsNotNull(expected);
            Assert.AreEqual(expected, actual);
}

我可以使用:

来调用它
AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName);

有没有简单的方法可以从这个方法中知道预期对象的“FirstName”文本?

我需要它用于记录目的,并在此方法中提供正确的错误消息。

C#来电者信息在这里没有帮助。

2 个答案:

答案 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()方法,然后您调用它来检索要记录的信息。