2011-11-17 111 views
3

下面的代碼產生的問題C#泛型列表轉換爲類實現列表<T>

不能鍵入'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; 
} 

編輯:將下面的信息移動到另一個問題。

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

如何,或者爲什麼會編譯器知道使用'DataFields'作爲'ToList的結果處理這多虧了一些有識之士的一種方式()'呼叫?爲什麼它不會選擇'DataFields2'(DataFields'的一個子類)或'DataFields3'(一個從List ''派生的無關類)? –

+0

全部。很明顯,我還沒有想到這一點,但似乎應該有可能。也許是另一種方法?在這裏,我不知所措,只是在尋找一些想法 –

回答

5

下面的構造添加到DataFields

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

Then

public static DataFields ConvertXML(XMLDocument data) {  
    var result = (BLAH..).ToList();  
    return new DataFields(result);  
} 
+0

不工作,同樣的問題:) – misha

+1

@misha - 它適用於我,但我認爲它依賴於'IEnumerable '接口的協變性,因此僅適用於C#4及更高版本。 –

+0

我明白了,感謝您的評論。 – misha

0

由於錯誤說你正試圖轉換DataField<T>其中TstringDataFields從的DatafieldList繼承和他們不一樣。

所以

DataField<string>不等於DataFields,你可以讓你的DataFieldsstring秒的列表,如果你想這個工作DataFields : List<string>

+0

我用反引號(')標記了類名作爲代碼序列。這一點尤其重要,因爲否則泛型將被視爲html標籤,並且當泛型部分被刪除時,您的語句沒有多大意義。 –

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,所以我們可以將它轉換爲該類型。

+0

仍然收到錯誤無法轉換對象 –

+0

編譯時錯誤是否導致它爲我編譯? – misha

+0

不,這不是編譯時錯誤。是的它爲我編譯,但它不會運行。 –

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; 
} 
相關問題