如何在C#中动态地转换通用列表?

时间:2009-08-21 20:43:20

标签: c# .net generics list casting

我正在尝试动态地将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??;

提前致谢!

6 个答案:

答案 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);
                }