c # Как реализовать коллекцию дженериков - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть рабочий класс, который работает с коллекцией объектов. Мне нужно, чтобы каждый из этих объектов имел два свойства, одно имеет неизвестный тип, а другое должно быть числом.

Я хотел использовать интерфейс, чтобы у меня было несколько классов элементов, которые допускали другие свойства, но были вынуждены иметь PropA и PropB, которые требуются рабочему классу.

Это код, который у меня до сих пор, который, казалось, был в порядке, пока я не попытался его использовать. Список MyItem не может быть передан как список IItem, хотя MyItem реализует IItem. Вот где я запутался.

Также, если это возможно, было бы замечательно, если бы при создании экземпляра рабочего класса мне не нужно было передавать значение T, вместо этого он знал бы, что основано на типе PropA.

Может ли кто-нибудь помочь мне разобраться? Спасибо!

public interface IItem<T>
{
    T PropA { get; set; }
    decimal PropB { get; set; }
}

public class MyItem : IItem<string>
{
    public string PropA { get; set; }
    public decimal PropB { get; set; }
}

public class WorkerClass<T>
{
    private List<T> _list;

    public WorkerClass(IEnumerable<IItem<T>> items)
    {
        doStuff(items);
    }
    public T ReturnAnItem()
    {
        return _list[0];
    }
    private void doStuff(IEnumerable<IItem<T>> items)
    {
        foreach (IItem<T> item in items)
        {
            _list.Add(item.PropA);
        }
    }
}
public void usage()
{
    IEnumerable<MyItem> list= GetItems();
    var worker = new WorkerClass<string>(list);//Not Allowed
}

1 Ответ

3 голосов
/ 23 апреля 2010

Вы можете сделать это, если вы предоставляете интерфейс напрямую вместо конкретного типа. Он просто не может сделать неявное преобразование для вас:

IEnumerable<IItem<string>> items = GetItems().Cast<IItem<string>>();
var worker = new WorkerClass<string>(items);

Напомним, ваш исходный код будет работать на C # 4, который поддерживает ковариацию на IEnumerable<T>. Но предыдущие версии C # этого не делают, поэтому вы получаете сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...