将列表<object>转换为未知类型</object>

时间:2014-12-12 11:14:52

标签: c# dynamic

我有一个输入字符串,由文件接收。它包含一些值,以;分隔; 例如。     1; 2; 3

我想将其转换为List。该属性通过反射进行恢复,因此我没有任何修复列表类型。

简而言之:作为输入,我有一个PropertyInfo(PropertyType)和一个字符串值。我想得到一个类型列表&#34; PropertyType&#34;作为输出。

我想做点什么

    private List<object> GetAsList(Type propertyType, string value)
    {
        List<object> list = new List<object>();
        var items = value.Split('|');
        foreach (var item in items)
        {
            list.Add(Convert.ChangeType(item, propertyType.GetGenericArguments().Single()));
        }
        return list;
    }

这里的问题是,我无法将List分配给,比方说List()。我可以使用这样的东西:

if(propertyType == typeof(List<Int32>)
list = new List<Int32>();
else if(propertyType == typeof(List<Int64>)
    list = new List<Int64>();
[...]

在我看来,这不是一个很好的解决方案。你知道如何解决这个问题吗?

4 个答案:

答案 0 :(得分:4)

使您的方法通用:

 private List<T> GetAsList<T>(string value)
 {
    List<T> list = new List<T>();
    var items = value.Split('|');
    foreach (var item in items)
    {
       list.Add((T)Convert.ChangeType(item, typeof(T)));
    }
    return list;
 }

并像这样使用它:

List<int> listOfInt = GetAsList<int>("1|2|3");
List<long> listOfLong = GetAsList<long>("5|6|7");
List<double> listOfDouble = GetAsList<double>("1.1|2|3.3");

如果在编译时不知道类型,可以使用反射调用GetAsList:

var propTypeDouble = typeof(List<double>);
var listOfDoubleRuntime = typeof([DelaringType])
                         .GetMethod("GetAsList")
                         .MakeGenericMethod(propTypeDouble.GetGenericArguments().First())
                         .Invoke(null, new[] {"1.1|2.2|3.3"});

答案 1 :(得分:0)

如果可能,我会按照其他人的建议使您的方法通用,但是,如果不可能,您可以使用Type参数创建一个实例,如下所示:

Type targetType = typeof(List<>).MakeGenericType(propertyType);
IList result = Activator.CreateInstance(targetType);

答案 2 :(得分:0)

你应该使用这样的东西 -

     private static List<T> GetAsList<T>(string value) 
        {
            List<T> list = new List<T>();
            var items = value.Split('|');
            foreach (var item in items)
            {
                TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
                if (converter != null)
                {
                    list.Add((T)converter.ConvertFrom(item));
                }
            }
            return list;
        }

和消费一样 -

        List<Int32> demoList = new List<Int32>();

        demoList = GetAsList<Int32>("1|2|5|7");

答案 3 :(得分:0)

<强>列表&LT; T&GT;列表;

是匿名类型,直到您想要创建它的实例。

<强>列表&LT;动态&GT;列表; 即使在您创建了它的实例之后,它仍然是动态类型

<强>列表&LT;动态&GT; list = new List&lt;动态&GT;()