【发布时间】:2012-04-09 05:49:00
【问题描述】:
我有两种扩展方法:
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 类型时才选择第二次重载。有没有办法在这两种情况下都选择第二个重载?
【问题讨论】:
-
collection1和collection2之间没有区别。它们是完全相同的代码,只是编写方式不同。 -
@svick,是的,但我想显示所有语法选项
-
请注意,它是一种扩展方法这一事实是无关紧要的;重载决议像普通的静态方法一样处理它。
-
好的,删除第一个。最好避免可以在 any 对象上工作而不受任何约束的扩展方法,因为噪音太大。同样值得注意的是源代码变得多么不可读。应该有什么?根本不要使用扩展方法,将其设为常规的公共静态方法。
-
@HansPassant,它实际上是流利的语法,我只是没有显示像 collection.ShouldHave().AllProperties().EqualTo(...) 这样的其余调用
标签: c# .net extension-methods overloading fluent-assertions