2012-07-27 150 views
0

我已使用ObservableCollectionDataBinding在我的WPF应用程序中,其中我将该集合绑定到DataGridsComboBoxes。由于需求,在需要根据条件从集合中删除对象时,我实现了RemoveAll功能,如List,使用Extension method扩展方法或继承?

This职位指定的Inheritance几个优点超过Extension methods,但不是我的情况很特殊,因为这是我需要添加的唯一方法,我不打算再添Extension method的集合。

我想知道对我来说这样做对我来说应该是Extension method,还是应该考虑继承这个类并将其添加为Instance method

此外,我想知道两者之间是否有任何性能差异,因为它在上述帖子中没有讨论过。

+0

考虑使用'Clear'作为名称,因为这是清除列表中的所有内容的好方法。另一点是,如果可用,编译器将使用对象 - Clear的实现(性能通常更好)。 – 2012-07-27 14:03:37

+0

那么,Clear()将删除所有内容,这不是我的观点。 – 2012-07-27 14:04:38

+0

ahh,我忘记了RemoveAll使用predicat-Delegate ......对不起!你绝对正确 – 2012-07-27 14:05:44

回答

2

为了一种方法,我会使用扩展方法。在这种情况下,这意味着您的代码可以继续使用ObservableCollection<T>而不需要维护自定义类型。

扩展方法简单归结为编译时的静态方法调用,所以我无法想象性能会比继承性差。如果有的话应该是相同或更好的。

个人喜好通常是驱动选择扩展方法的原因。

+0

谢谢。这回答了我的问题。 +1。 – 2012-07-27 14:02:22

4

如果您计划仅增强ObservableCollection而不仅仅是RemoveAll(),那么将其子类化并添加您的功能。如果您想将RemoveAll()添加到ObservableCollection中,那么您可以创建一个扩展方法,该方法不仅可以处理ObservableCollections,还可以通过在heirarchy中定位IEnumerable或另一个通用父项。在该方法中,您可以测试该集合是否支持CollectionChanged,并对其进行适当处理。

这里没有正确或错误的答案,这是任何适合您的需求。

+0

+1好点! – 2012-07-27 13:54:13

+0

好吧,正如我已经指定的那样,我不打算添加任何其他功能,而且我经常使用IList时,我不必做任何绑定,并且已经有了方法,我不认为我需要扩展这对任何其他类型。但好点(+1),我可能会在未来使用这个建议。 – 2012-07-27 13:59:42

1

使用扩展方法,您可以扩展接口,从而扩展该接口的每个实现者。

我会用扩展方法System.Collections.IList来做。 System.Collections.IList使用无处不在...

public class static Extension 
{ 
    public static void RemoveAll(this System.Collections.IList list) 
    { 
     ... 
    } 
} 

这将延长几乎所有集合实现。

+0

好吧,这看起来不错,但我想我现在不需要将此功能扩展到其他类型。但一个很好的建议。 +1。 – 2012-07-27 14:01:04