c# - 如何知道传递给方法的变量/属性名称?

标签 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# 调用者信息在这里没有帮助。

最佳答案

我会重新考虑这种方法,因为这可能会在某些时候产生反作用 - 但如果您真的热衷于获得某种程度的自动化,您可以试试这个:

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/

相关文章:

javascript - 如何在ASPX页面弹出条件确认框?

c# - 将进程作为 Windows 服务运行时的最佳做法是什么?

unit-testing - Grails listOrder中单元测试中的@Mock域对象动态查找器抛出异常

java - Robolectric 单元测试自定义布局上的 ClassCastException

c# - Control.Invoke 从运行表单的同一线程

c# - 在 ASP.NET MVC 中通过 CancellationToken 中止 AJAX 请求

.net - NHibernate 的产品发布

javascript - 如何正确地对数字转换进行单元测试

c# - WPF 文本 block 不能多行

.net - 将键/值对列表序列化为 XML