将对象转换为通用列表
我有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
请享用!
我有同样的问题,通过查看铸造对象的目的解决了它。 你真的需要将它转换为特定的(封闭的)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 }