我正在尝试动态地将List<object>
投射到List<string>
。我尝试了几种方法,但我找不到解决方案。这是一个显示问题的小样本:
List<object> listObject = new List<object>();
listObject.Add("ITEM 1");
listObject.Add("ITEM 2");
listObject.Add("ITEM 3");
List<string> listString = ¿¿listObject??;
提前致谢!
答案 0 :(得分:18)
如果您可以使用LINQ,那么Cast
方法将满足您的需求:
List<string> listString = listObject.Cast<string>().ToList();
你也可以使用ConvertAll
方法,正如斯坦在答案中指出的那样:
List<string> listString = listObject.ConvertAll(x => (string)x);
如果您没有使用C#3,则需要使用“旧”委托语法而不是lambda:
List<string> listString =
listObject.ConvertAll(delegate(object x) { return (string)x; });
答案 1 :(得分:4)
如果您使用的是.NET 3.5,则可以使用,这样您就不必再执行额外的ToList()。如果需要转换高级对象,还可以提供自己的转换器。
List<string> listString = listObject.ConvertAll(x=> x as String);
如果你不能使用LINQ,你可以这样做
foreach(object item in listObject)
{
string convertedItem = item as String;
if(convertedItem != null)
listString.Add(convertedItem);
}
答案 2 :(得分:1)
怎么回事:
public static List<T> ConvertToGenericList<T>(IList listOfObjects)
{
List<T> items = new List<T>();
for (int i = 0; i < listOfObjects.Count; i++)
{
items.Add((T)listOfObjects[i]);
}
return items;
}
用法:
List<object> listObject = new List<object>();
listObject.Add("ITEM 1");
listObject.Add("ITEM 2");
listObject.Add("ITEM 3");
List<string> listString = Converter.ConvertToGenericList<string>(listObject);
答案 3 :(得分:0)
我认为你不能一步到位。相反,尝试这样的事情:
List<object> listObject = new List<object>();
listObject.Add( "ITEM 1" );
listObject.Add( "ITEM 2" );
listObject.Add( "ITEM 3" );
List<string> lstStr = new List<string>( listObject.Count );
foreach ( object obj in listObject )
{
lstStr.Add( obj.ToString() );
}
答案 4 :(得分:0)
List<string> listString = (from o in listObject select (string)o).ToList();
答案 5 :(得分:-2)
我的第一篇文章...希望有用看起来在我的项目中起作用......
public dynamic ConvertList(Type CallingType)
{
dynamic DynamicList;
if (CallingType == TypeOfValue)
{
Type d1 = typeof(List<>);
Type[] typeArgs = { TypeOfValue };
Type DynamicListType = d1.MakeGenericType(typeArgs);
object DynamicListObj = Activator.CreateInstance(DynamicListType);
DynamicList = Convert.ChangeType(DynamicListObj, DynamicListType);
foreach (object ValueElement in ValueRange)
{
dynamic el = Convert.ChangeType(ValueElement, TypeOfValue);
DynamicList.Add(el);
}
}
else //retrun empty List but with right type
{
Type d1 = typeof(List<>);
Type[] typeArgs = { CallingType };
Type DynamicListType = d1.MakeGenericType(typeArgs);
object DynamicListObj = Activator.CreateInstance(DynamicListType);
DynamicList = Convert.ChangeType(DynamicListObj, DynamicListType);
}
return DynamicList;
}
我想我会在某个地方添加一个试试。
如何测试
if (PropertyType == typeof(UInt32))
{
List<UInt32> UInt32_test = NewProperty.ConvertList(PropertyType);
}
if (PropertyType == typeof(string))
{
List<string> string_test = NewProperty.ConvertList(PropertyType);
}