Я пытаюсь преобразовать тип IList
в тип List
, но каждый раз получаю сообщение об ошибке.
List<SubProduct> subProducts= Model.subproduct;
Model.subproduct
возвращает IList<SubProduct>
.
Я пытаюсь преобразовать тип IList
в тип List
, но каждый раз получаю сообщение об ошибке.
List<SubProduct> subProducts= Model.subproduct;
Model.subproduct
возвращает IList<SubProduct>
.
Пытаться
List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct);
or
List<SubProduct> subProducts = Model.subproducts as List<SubProduct>;
Model.subproducts
уже имеет тип List<SubProduct>
под крышками. Если это другая реализация IList<SubProduct>
, например ReadOnlyCollection<SubProduct>
, она молча вернет null и, вероятно, вызовет очень запутанный NullReferenceException
позже при выполнении программы. И действительно, если мы знаем, что это всегда будет List<T>
, тогда какой вообще смысл возвращать IList<T>
?
- person sstan; 27.11.2017
Как насчет этого:
List<SubProduct> subProducts = Model.subproduct.ToList();
В моем случае мне пришлось это сделать, потому что ни одно из предложенных решений не было доступно:
List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList();
List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct;
Неявное преобразование терпит неудачу, потому что List<>
реализует IList
, а не наоборот. Итак, вы можете сказать IList<T> foo = new List<T>()
, но не List<T> foo = (some IList-returning method or property)
.
List<ProjectResources> list = new List<ProjectResources>();
IList<ProjectResources> obj = `Your Data Will Be Here`;
list = obj.ToList<ProjectResources>();
Это преобразует объект IList в объект списка.
Во всех остальных ответах рекомендуется использовать AddRange с IList.
Более элегантное решение, позволяющее избежать приведения типов, - реализовать расширение IList для выполнения этой работы.
В VB.NET:
<Extension()>
Public Sub AddRange(Of T)(ByRef Exttype As IList(Of T), ElementsToAdd As IEnumerable(Of T))
For Each ele In ElementsToAdd
Exttype.Add(ele)
Next
End Sub
И в C #:
public void AddRange<T>(this ref IList<T> Exttype, IEnumerable<T> ElementsToAdd)
{
foreach (var ele in ElementsToAdd)
{
Exttype.Add(ele);
}
}
Если у вас есть IList, содержащий интерфейсы, вы можете преобразовать его следующим образом:
Список в IList
List<Foo> Foos = new List<Foo>();
IList<IFoo> IFoos = Foos.ToList<IFoo>();
IList в список
IList<IFoo> IFoos = new List<IFoo>();
List<Foo> Foos = new List<Foo>(IFoos.Select(x => (Foo)x));
Предполагается, что Foo
имеет IFoo
интерфейс.
Это лучший вариант для приведения / преобразования списка универсального объекта в список строк.
object valueList;
List<string> list = ((IList)valueList).Cast<object>().Select(o => o.ToString()).ToList();
IList
нет того, что есть уList
, напримерAddRange
- person Serj Sagan   schedule 20.11.2017