2013-12-19 45 views
3
private static void AssertNotNullAndAreEqual<T, TK>(T expected, TK actual) 
{ 
      Assert.IsNotNull(expected); 
      Assert.AreEqual(expected, actual); 
} 

我可以用叫它:如何知道传递给方法的变量/属性名称?

AssertNotNullAndAreEqual(expected.FirstName, actual.FirstName); 

有没有什么简单的方法,我可以从这种方法中知道了预期目标的“名字”文本?

我会需要它为记录目的,并提供适当的错误信息从这个方法。

C#调用者信息在这里没有帮助。

+3

不,您不得不确保您将该信息与物业价值一起传递。 –

+2

通常情况下,获取某个值*和*的值会提供值存储和值标识符,因此检索实例可以获取该值本身并知道其来源。 –

回答

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); 

几道警告

  • 了很多东西不会被检查,直到COM堆积时间(幸运的是,类型安全性得以保留)。编写可以正确编译的调用很容易,但在运行时会失败。
  • 因为这是写的,它不会与变量一起工作 - 但如果你决定这样做,写起来会很容易。

如果您使用ToString()用于其他目的(我假设你),你可以定义一个接口,并使用它作为一个类型约束上AssertNotNullAndAreEqual(...)请根据自己的判断:)

0

使用,或者交替检查传递给AssertNotNullAndAreEqual(...)的对象是否有界面。

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

相关问题