2011-07-14 163 views
1
public static void ShouldNotBeNull<T>(this T actualValue) 
{ 
    Assert.IsFalse(actualValue == null, "Object is null, and should not be null.") ; 
} 

我想在測試中的錯誤字符串中提供一個變量名。我有這個作爲擴展方法。是否有可能獲得傳入的變量的真實參數名稱?是否可以使用反射來獲取通過此函數傳遞給函數的變量的名稱?

+0

以及如果傳入表達式該怎麼辦?例如:'obj1.providevalue(obj2,obj3.i + obj4.j).ShouldNotBeNull()'。 – Vlad

+3

你可以使用'Assert.IsNotNull(actualValue)'使你的代碼讀得更好一點。 – dlev

+0

我真的只是在這裏與@ dlev的建議去... –

回答

1

我有一個選項written up before正在使用匿名類型。例如,你必須:

public void Foo(string x, string y, string z) // x and z must not be null 
{ 
    new { x, z }.AssertNoNullElements(); 
} 

與通用AssertNotNull方法執行一些反射等一次,並緩存性能,以實現業績儘可能少的訪問爲代表。

這不是我通常會推薦的。它不是可以重構的,它會在每次調用時創建一個新對象,並且通常會濫用匿名類型。誠然,如果這是做檢查,性能方面是不是那麼糟糕......

0

考慮

public static void ShouldNotBeNull<T>(this T actualValue, string variableName) 
{ 
    Assert.IsFalse(actualValue == null, variableName + " is null, and should not be null.") ; 
} 
+0

真的嗎?你不相信調用者足以傳遞一個非空值,但你相信他們足以傳遞相同值的正確變量名稱? –

+0

那麼,寫'obj.ShouldNotBeNull(var,「var」);'應該很簡單。 –

+0

它看起來很傻,容易出錯,而且真的不比調用者自己檢查null本身簡單 –

-1

沒有,呼叫者很可能甚至沒有分配給一個變量名「這個參數或任何其他參數

相關問題