C# снимая список <ObjBase> в качестве списка <Obj>

Программное обеспечение ITA использует изрядное количество CL.

http://www.itasoftware.com/careers/l_e_t_lisp.html?catid=8

26
задан AndrewJacksonZA 12 August 2009 в 12:57
поделиться

9 ответов

Пожалуйста, ответьте на следующие вопросы:

.NET Casting Generic List

Почему это общее приведение не работает?

8
ответ дан 28 November 2019 в 06:44
поделиться

Вы можете использовать методы расширения Cast и ToList из System.Linq, чтобы поместить это в одну строку.

Вместо

internal List<Obj> returnStuff()
{
   return getSomeStuff() as List<Obj>;
}

сделайте это:

internal List<Obj> returnStuff()
{
   return getSomeStuff().Cast<Obj>().ToList();
}
35
ответ дан 28 November 2019 в 06:44
поделиться

Ковариант, друг мой. Взгляните на http://blog.tlk.com/dot-net/2009/c-sharp-4-covariance-and-contravariance

3
ответ дан 28 November 2019 в 06:44
поделиться

Я могу описать только "проблема" с точки зрения Java, но насколько мне известно, этот аспект одинаков как в C #, так и в Java:

A List не является List , потому что он может содержать объект ObjBase , который не является объектом Obj .

Другой способ обойти List может ] not должно быть преобразовано в List , потому что первый гарантирует принятие вызова Add () с аргументом ObjBase , который последний не будет принимать!

Итак, подведем итог: даже если Obj является ObjBase a List - это , а не List .

10
ответ дан 28 November 2019 в 06:44
поделиться

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

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

Какова цель этой попытки заброса?

1
ответ дан 28 November 2019 в 06:44
поделиться

В настоящее время C # не поддерживает вариативность для универсальных типов. Судя по тому, что я читал, это изменится в 4.0.

См. здесь для получения дополнительной информации о дисперсии в обобщенных шаблонах.

1
ответ дан 28 November 2019 в 06:44
поделиться

Linq имеет метод ConvertAll. так что что-то вроде

list.ConvertAll<Obj>(objBase => objbase.ConvertTo(obj));

Я не знаю, что еще предложить. Я предполагаю, что ObjBase является базовым классом, и если все объекты ObjBase являются объектами Obj, я не уверен, зачем вам вообще нужны эти два объекта. Возможно, я ошибаюсь.

Изменить: метод list.Cast будет работать лучше, чем приведенный выше, при условии, что они могут быть преобразованы друг в друга. Забыл об этом, пока не прочитал другие ответы.

0
ответ дан 28 November 2019 в 06:44
поделиться

Это главная проблема C # - именно так создавались дженерики. Список не расширяет список, это просто совершенно другой тип. Вы не можете преобразовать или назначить их друг другу, единственный вариант - скопировать один список в другой.

0
ответ дан 28 November 2019 в 06:44
поделиться

Лазарь :
Я думал, что компилятор поймет, что я хочу, чтобы действия выполнялись над объектами списка, а не то, что я пытался преобразовать сам список.

Дополнительная информация:

public abstract class ObjBase
   {
   }

internal interface IDatabaseObject
   {
   }

public class Obj : ObjBase, IDatabaseObject
   {
   }


internal interface IDatabaseObjectManager
   {
      List<ObjBase> getSomeStuff();
   }

public class ObjManager : IObjManager
{
    public List<Obj> returnStuff()
    {
       return getSomeStuff().Cast <Customer>().ToList<Customer>();
    }

    private List<ObjBase> getSomeStuff()
    {
       return new List<ObjBase>();
    }
}

Теперь клиентский код вне этой DLL может пойти: ObjManager objM = новый ObjManager (); Список listOB = objM.returnStuff (); Я собираюсь создать несколько типов Obj и ObjManager для этой части (O / RM) приложения.

(В блоке комментариев, черт возьми, закончились символы!: - )

0
ответ дан 28 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: