将对象转换为通用列表

我有3个generict类型列表。

List = new List(); List
= new List
(); List = new List();

并将其保存在具有类型对象的变量上。 现在我做了Cast back to List来执行foreach,有些像这样:

 List = (List)obj; 

但obj内容每次都在变化,我有一些这样的:

 List = (List)obj; 

我有另一个变量保持当前obj类型:

 Type t = typeof(obj); 

我可以做那样的事吗??:

 List = (List)obj; 

Obs:我没有列表中的当前类型,但我需要强制转换,而我现在不再使用另一种forms:

 List = new List(); 

真是一个棘手的问题。 试试这个:

 List c = null; List
a = null; List d = null; object o = GetObject(); c = o as List; a = o as List
; d = o as List;

在c,a和d之间,有2个空值和1个非空值,或3个空值。


拿2:

 object o = GetObject(); IEnumerable e = o as IEnumerable; IEnumerable c = e.OfType(); IEnumerable
a = e.OfType
(); IEnumerable d = e.OfType();

大量的试验和错误在SL 5上给了我这个,但它也应该适用于常规的C#。 您还需要将LINQ添加到您的使用列表中,以便后半部分正常工作。

  List myAnythingList = (value as IEnumerable).Cast().ToList() 

请享用!

我有同样的问题,通过查看铸造对象的目的解决了它。 你真的需要将它转换为特定的(封闭的)generics类型吗? 在我的情况下,(开放)generics类型有一个我用来投射它的接口。

 var list = obj as IUsefulInterface; list.MethodThatIAmInterestedIn(); 

这样的通用解决方案(用于基于System.Type对象实例化具有generics参数的类型)是不可能的。 如果你真的只是处理这三种类型,那么你很幸运,因为它很容易:

 Type t = typeof(obj); if (t == typeof(List)) { var contactList = (List)obj; // do stuff with contactList } else if (t == typeof(List
)) { var addressList = (List
)obj; // do stuff with addressList } else if (t == typeof(List)) { var documentList = (List)obj; // do stuff with documentList }

不,你不能在不转弯的情况下进行投射(这是:reflection),必须在编译时知道generics类型参数。 你当然可以这样做:

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

我在编写validation属性时遇到了这个问题,我从ValidationContext收到了一个对象,并且知道它需要是一个列表,但不是它的列表。 当我尝试将其转换为IEnumerable时,它抛出exception,但它可以转换为IEnumerable ,然后通过linq允许.Cast()

最终有效的是:

 var enumerable = listObject as IEnumerable; var list = enumerable.Cast().ToList(); 

我遇到了同样的问题 – 我有一个集合,其数据类型仅在运行时已知,我无法将其转换为任何内容。 以上解决方案均无效。 最后,我通过序列化到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(); ... } 

您可能需要这样做:

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