我有一个给定的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
将是数字,例如type
,type
,int
等
我可以吐出short
并将每个转换为给定的long
..
csv
我无法创建type
的{{1}}并向其中添加数字。
我该怎么做?
答案 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]);
}