首页 > 解决方案 > 创建 IEnumerable并向其中添加项目

问题描述

我有一个给定type的逗号分隔值string

Type type = service.getType();

String csv = "1,2,3";

我需要将csv字符串转换为IEnumerableof type

我知道那type将是数字,例如 , ,int等。shortlong

我能够吐出csv并将每个转换为给定的type..

String[] inputs = csv.Split(',');

TypeConverter converter = TypeDescriptor.GetConverter(modelType);

if (converter != null) {

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

  }

}

我无法创建一个IEnumerableoftype并向其添加数字。

我怎样才能做到这一点?

标签: c#

解决方案


您实际上在运行时拥有该类型,因此您需要使用反射来创建一个类型的对象,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);
    }

推荐阅读