Erik Johnson
Erik Johnson

Reputation: 878

Iterating over a list of objects that implement a common interface

I have an interface shared by several objects, defined as so:

public interface IConvertibleToListItem
{
    ListViewItem toListItem();
}

I have lists of objects that share this interface. I want to be able to do this:

refreshList(newsListView, _news);

private void refreshList(ListView lv, List<IConvertibleToListItem> items)
{
    lv.Items.Clear();
    foreach (IConvertibleToListItem item in items) { lv.Items.Add(item.toListItem()); }
}

But I get an error about the best overloaded method match having some invalid arguments.

Upvotes: 0

Views: 1005

Answers (1)

Lee
Lee

Reputation: 144136

This is a variance problem - List<News> is not compatible with List<IConvertibleToListItem>. For your method you can use IEnumerable<IConvertibleToListItem> since you are only iterating over the collection:

private void refreshList(ListView lv, IEnumerable<IConvertibleToListItem> items)
{
    lv.Items.Clear();
    foreach (IConvertibleToListItem item in items) { lv.Items.Add(item.toListItem()); }
}

if for some reason you need to use a List you can make your method generic:

private void refreshList<T>(ListView lv, List<T> items)
    where T : IConvertibleToListItem
{
    lv.Items.Clear();
    foreach (IConvertibleToListItem item in items) { lv.Items.Add(item.toListItem()); }
}

Upvotes: 1

Related Questions