2010-05-14 139 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(); 
    ... 
}