2010-05-14 171 views
10

我有3個通用類型列表。將對象轉換爲通用列表

List<Contact> = new List<Contact>(); 
List<Address> = new List<Address>(); 
List<Document> = new List<Document>(); 

並將其保存在一個帶有對象類型的變量上。現在我NEDD做轉換回列表中perfom一個foreach,有的像這樣:

List<Contact> = (List<Contact>)obj; 

但OBJ每次內容變化,我有一些這樣的:

List<???> = (List<???>)obj; 

我有另一個變量控股當前obj類型:

Type t = typeof(obj); 

我可以做一些事情一樣,??:

List<t> = (List<t>)obj; 

觀測值:我沒有當前類型列表中,但我需要投了,我現在不另一種形式來代替:

List<Contact> = new List<Contact>(); 

回答

27

什麼是粘性問題。試試這個:

List<Contact> c = null; 
List<Address> a = null; 
List<Document> d = null; 

object o = GetObject(); 

c = o as List<Contact>; 
a = o as List<Address>; 
d = o as List<Document>; 

在c,a和d之間,有2個空值和1個非空值或者3個空值。


以2:

object o = GetObject(); 
IEnumerable e = o as IEnumerable; 
IEnumerable<Contact> c = e.OfType<Contact>(); 
IEnumerable<Address> a = e.OfType<Address>(); 
IEnumerable<Document> d = e.OfType<Document>(); 
+0

在未來我需要更多的物體,不工作謝謝! – JoeLoco 2010-05-14 19:47:00

+2

它工作的人,7個小時,感謝lottttttttttttttt !!!!!! – JoeLoco 2010-05-14 19:54:09

1

像這樣的通用解決方案(實例一種基於通用參數一個System.Type對象)是不可能的。如果你真的只是處理這三種類型,那麼你很幸運,因爲它很容易:

Type t = typeof(obj); 

if (t == typeof(List<Contact>)) { 
    var contactList = (List<Contact>)obj; 
    // do stuff with contactList 

} else if (t == typeof(List<Address>)) { 
    var addressList = (List<Address>)obj; 
    // do stuff with addressList 

} else if (t == typeof(List<Document>)) { 
    var documentList = (List<Document>)obj; 
    // do stuff with documentList 
} 
+0

在未來我需要更多的物體,不工作謝謝! – JoeLoco 2010-05-14 19:46:07

-1

你可能需要做的:

if(object is List) 
{ 
    list = (List)object 
} 
+1

不是真的,沒有。 – Femaref 2010-05-14 19:48:25

+2

列表需要一個類型,不工作謝謝! – JoeLoco 2010-05-14 19:48:28

0

不,你不能投放,而周圍的角落去(這就是:反射),泛型類型參數必須在編譯時已知。當然,你可以做這樣的事情:

content.Where(o => o is type).ToList().Foreach(stuff);

17

大量的試驗和錯誤給了我這個在SL 5,但它也應該定期C#的工作。您還需要將LINQ添加到您的後半部分使用列表中。

List<object> myAnythingList = (value as IEnumerable<object>).Cast<object>().ToList() 

享受!

+0

這是我在過去一小時工作過的堆棧溢出中找到的唯一解決方案。謝謝! 我的問題是在反射.Invoke()返回和對象,它在運行時是一個List 。但是我不知道這個類,只有IUnifyingDef接口。直接轉換和使用Convert()都會拋出異常,或者無法編譯。 – jgerman 2014-02-13 03:59:50

+0

該方法的問題在於'ToList()'創建另一個列表並且它不是原始實例 – JobaDiniz 2016-10-20 18:49:34

+0

我從來沒有發現過這個問題。非常感謝。 – nhwilly 2017-10-14 20:44:44

2

我有同樣的問題,並通過查看鑄造對象的目的來解決它。你真的需要把它轉換成特定的(封閉的)泛型類型嗎?在我的情況下,(open)泛型類型有一個我用來投射的界面。

var list = obj as IUsefulInterface; 

list.MethodThatIAmInterestedIn(); 
0

我寫,我從ValidationContext接收的對象,並知道它需要的是一個列表中的驗證屬性,當有這個問題,但是不知道它是列表。當我試圖將它投射爲IEnumerable<object>時,它會拋出異常,但它可以投射爲IEnumerable,然後通過linq允許.Cast<object>()

在什麼工作最終是:

var enumerable = listObject as IEnumerable; 
var list = enumerable.Cast<object>().ToList(); 
0

我遇到了同樣的問題 - 我有一個數據類型在運行時只知道一個集合,我不能把它轉換到任何東西。上述解決方案都沒有奏效。最後我通過序列化到JSON和反序列化來解決它。當然這並不理想,但可以幫助某人。

string jsonString = JsonConvert.SerializeObject(myObject); 
jsonString = "{ values:" + jsonString + "}"; 

JObject j = JObject.Parse(jsonString); 

//now we can iterate over the list 
foreach (var x in j["values"]) 
{ 
    string name = x.ToString(); 
    ... 
} 
相關問題