C#Generic List转换为实现List <t> </t>的类

时间:2011-11-17 14:49:06

标签: c# list generics linq-to-xml

以下代码会产生问题

  

无法将类型'System.Collections.Generic.IEnumberable<DataField<string>>'隐式转换为“DataFields”。存在显式转换(您是否错过了演员?)。

我如何解决这个问题?我做错了什么?

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;
}

已编辑:将以下信息移至另一个问题。

Using LINQ to create a List<T> where T : someClass<U>

此外,我希望能够在此语句中执行以下操作,以便为每个语句设置值的类型。我怎样才能做到这一点。

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

4 个答案:

答案 0 :(得分:5)

将以下构造函数添加到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 :(得分:1)

好的,由于你们的一些见解,我找到了解决这个问题的方法

// 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;
}

答案 2 :(得分:0)

正如错误所示,您尝试将DataField<T> T string转换为DataFields,而List继承自DatafieldDataField<string>他们不一样。

所以

DataFields不等于DataFields,如果您希望string <{1}},可以将DataFields : List<string>作为{{1}}的列表{{1}}

答案 3 :(得分:0)

这种方法怎么样:

 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,因此我们可以将其转换为该类型。

相关问题