以下代码会产生问题
无法将类型
'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
}
答案 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
继承自Datafield
和DataField<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
,因此我们可以将其转换为该类型。