Преобразование общего списка C # в класс, реализующий список <T> - PullRequest
3 голосов
/ 17 ноября 2011

Следующий код вызывает проблему

Невозможно неявно преобразовать тип 'System.Collections.Generic.IEnumberable<DataField<string>>' в «Поля данных». Существует явное преобразование (вам не хватает приведения?).

Как мне обойти это? Что я делаю не так?

public class DataFields : List<DataField>
{
}

public abstract class DataField
{
    public string Name { get; set; }
}

public class DataField<T> : DataField
{
    public T Value { get; set; }
}

public static DataFields ConvertXML(XMLDocument data) {
    DataFields result = (from d in XDocument.Parse(data.OuterXML).Elements()
                      select new DataField<string>
                      {
                          Name = d.Name.ToString(),
                          Value = d.Value
                      }).ToList();
    return result;
}

Отредактировано: перемещение информации ниже к другому вопросу.

Использование LINQ для создания списка , где T: someClass

Кроме того, я хотел бы иметь возможность сделать что-то вроде следующего в этом утверждении, чтобы установить тип значения для каждого. Как мне это сделать.

select new DataField<[Attribute of element called type]>
{
  Name = d.Name.ToString(),
  Value = d.Value
}

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Добавьте следующий конструктор к классу DataFields

public class DataFields : List<DataField> {
    public DataFields() : base() {}
    public DataFields(IEnumerable<DataField> items) : base(items){}
}  

Затем

public static DataFields ConvertXML(XMLDocument data) {      
    var result = (BLAH..).ToList();      
    return new DataFields(result);     
}  
1 голос
/ 17 ноября 2011

Хорошо, я нашел один способ справиться с этим благодаря некоторой информации от вас, ребята

// Dont use this class
// public class DataFields : List<DataField>
// {
// }

public abstract class DataField
{
    public string Name { get; set; }
}

public class DataField<T> : DataField
{
    public T Value { get; set; }
}

public static List<DataField> ConvertXML(XMLDocument data) {  //return List<DataField>
     result = (from d in XDocument.Parse(data.OuterXML).Elements()
                      select new DataField<string>
                      {
                          Name = d.Name.ToString(),
                          Value = d.Value
                      }).Cast<DataField>().ToList();  // use cast
    return result;
}
0 голосов
/ 17 ноября 2011

Как насчет этого подхода:

 public static DataFields ConvertXML(XmlDocument data)
        {
            DataFields result = (DataFields)(from d in XDocument.Parse(data.OuterXml).Elements()
                                  select new DataField<string>
                                  {
                                      Name = d.Name.ToString(),
                                      Value = d.Value
                                  }).Cast<DataField>();
            return result;
        }

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

0 голосов
/ 17 ноября 2011

Как показывает ошибка, вы пытаетесь преобразовать DataField<T>, где T равно string в DataFields, которое наследуется от List из Datafield, и они не совпадают.

DataField<string> не равно DataFields, вы можете создать свой DataFields как список string с, если хотите, чтобы это работало DataFields : List<string>

...