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

C# 如何知道传递给方法的变量/属性名?,c#,.net,unit-testing,C#,.net,Unit Testing,有没有简单的方法可以让我从这个方法中知道预期对象的“FirstName”文本 我需要它来记录日志,并在这个方法中给出正确的错误消息 C#呼叫者信息在这里没有帮助。我会重新考虑这种方法,因为这可能会在某一点上产生负面影响-但是如果你真的希望获得某种程度的自动化,你可以尝试以下方法: AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName); 没有更多的警告了 在编译时之前,很多内容都不会被检查(幸运的是,类型安全性得到了保护)

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

我需要它来记录日志,并在这个方法中给出正确的错误消息


C#呼叫者信息在这里没有帮助。

我会重新考虑这种方法,因为这可能会在某一点上产生负面影响-但是如果你真的希望获得某种程度的自动化,你可以尝试以下方法:

AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName);
没有更多的警告了

  • 在编译时之前,很多内容都不会被检查(幸运的是,类型安全性得到了保护)。编写能够正确编译但在运行时失败的调用很容易
  • 在编写时,它不适用于变量——但如果您决定这样做,编写起来会非常容易

请自行决定使用:)

如果您将
ToString()
用于其他目的(我假设您是这样),您可以定义一个接口并将其用作
AssertNotNullandReeQual(…)
上的类型约束,或者检查是否传递给
AssertNotNullandReeQual(…)的对象
拥有该界面


你定义一个接口,比如说
IDebugString
,它有一个
ToDebugString()
方法,然后调用它来检索要记录的信息。

不,没有,您必须确保将该信息与属性的值一起传递。让某个对象检索某个值并知道它是哪个值的通常模式将同时提供值存储和值标识符,以便检索实例可以获取该值本身并知道从何处获取该值。
AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName);
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);