2013-12-19 67 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()方法,然後你調用它來檢索要記錄的信息。

相關問題