簡體   English   中英

擴展方法過載選擇

[英]Extension methods overload choice

我有兩種擴展方法:

public static IPropertyAssertions<T> ShouldHave<T>(this T subject)
{
    return new PropertyAssertions<T>(subject);
}

public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject)
{
    return new CollectionPropertyAssertions<T>(subject);
}

現在我寫一些使用它的代碼:

List<Customer> collection2 = new List<Customer>(); 
collection2.ShouldHave(); //first overload is chosen
IEnumerable<Customer> collection3 = new List<Customer>(); 
collection3.ShouldHave(); //second overload is chosen

僅當我明確指定IEnumerable類型時才選擇第二個重載。 有沒有辦法在兩種情況下都選擇第二次過載?

第一個重載是更好的匹配,因為T被推斷為List<Customer> ,它給出了完全匹配。 對於第二個重載,它會將T推斷為Customer ,因此參數將是IEnumerable<Customer> ,這與List<Customer>匹配不太精確。

不要這么認為。 不要認為在這種情況下可能總是會調用IEnumerable<T>重載,因為它在T類型方面的匹配度較低 如果未指定具體的IEnumerable<T> ,則在這種情況下,最佳匹配將始終是第一種方法。

在Fluent Assertion 2.0中,我終於設法以一種體面的方式解決了上述問題。 閱讀所有相關內容: http//www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html

ShouldHave()具有雙重含義。 在第一種情況下,ShouldHave()有一個關於subject-parameter提供的對象的返回。 在第二種情況下,返回是關於枚舉中的項目,而不是關於枚舉本身。

如果我創建自己的集合並且我想測試這個集合本身(而不是項目),我當然希望調用ShouldHave(這個T主題)而不是ShouldHave(這個IEnumerable主題)。

也許你應該重新考慮你的設計。 第二個ShouldHave()做了兩件事,所以應該分成一個方法來提取集合項和調用你已經擁有的第一個ShouldHave()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM