创建IEnumerable <t>并向其中添加项目

时间:2019-05-20 22:45:25

标签: c#

我有一个给定的11:26: error: conversion from 'std::string(std::istreambuf_iterator<char, std::char_traits<char> > (*)(std::ifstream), std::istreambuf_iterator<char, std::char_traits<char> > (*)()) {aka std::basic_string<char> (std::istreambuf_iterator<char, std::char_traits<char> > (*)(std::basic_ifstream<char>), std::istreambuf_iterator<char, std::char_traits<char> > (*)())}' to non-scalar type 'std::string {aka std::basic_string<char>}' requested 和一个逗号分隔的值type

string

我需要将Type type = service.getType(); String csv = "1,2,3"; 字符串转换为csv的{​​{1}}。

我知道IEnumerable将是数字,例如typetypeint

我可以吐出short并将每个转换为给定的long ..

csv

我无法创建type的{​​{1}}并向其中添加数字。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您实际上在运行时具有该类型,因此您将需要使用反射来创建类型为List<T>的对象,其中T是要从服务中获取的类Type的实例。以下代码将创建类型为List<T>的实例,而T在编译时不是类型,而是在运行时解析。以下是创建代码的代码:

var listTypeInstance = typeof(List<>);
var instanceList = listTypeInstance.MakeGenericType(type);

var numbers = (IList)Activator.CreateInstance(instanceList);

现在,您可以调用Add方法并在其中添加每个数字,例如:

var number = converter.ConvertFromString(input);
numbers.Add(number);

在代码中调整后的外观如下:

var listTypeInstance = typeof(List<>);
var instanceList = listTypeInstance.MakeGenericType(type);

var numbers = (IList)Activator.CreateInstance(instanceList);

foreach (String input in inputs) {
    if (converter.CanConvertTo(type)) {
      var number = converter.ConvertFromString(input);
      // Add number to an IEnumerable of numbers
      numbers.Add(number);
    }

答案 1 :(得分:2)

使用dynamic跳过编译时错误。

var runtimeTypes = new List<Type>
{
    typeof(int),
    typeof(long)
};
foreach (var item in runtimeTypes)
{
    var listType = typeof(List<>).MakeGenericType(item);
    dynamic list = Activator.CreateInstance(listType);
    list.Add(1); // Call Add() on dynamic works!
    Console.WriteLine(list[0]);
}