【问题标题】:Cast List<Object> to unknown type将 List<Object> 转换为未知类型
【发布时间】:2014-12-12 20:05:36
【问题描述】:

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

我想将其转换为列表。该属性是通过反射检索的,所以我没有任何修复列表类型。

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

我想做类似的事情

    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>();
[...]

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

【问题讨论】:

  • 怎么样List&lt;object&gt;你可以用它

标签: c# dynamic


【解决方案1】:

让你的方法通用:

 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"});

【讨论】:

  • 感谢 GetMethod 的提示 -> 这就是我想要的。我认为,这是一个更好的解决方案,而不是检查 switch / if 在运行时使用泛型方法中的类型。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你应该使用这样的东西 -

         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");
    

    【讨论】:

      【解决方案4】:

      列表列表;

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

      列表列表; 即使您创建了它的实例,它也始终是动态类型

      List list = new List()

      【讨论】:

        猜你喜欢
        • 2018-11-12
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多