簡體   English   中英

創建IEnumerable <T> 並添加項目

[英]Create IEnumerable<T> and add items to it

我有一個給定的type和一個逗號分隔值string

Type type = service.getType();

String csv = "1,2,3";

我需要將csv字符串轉換為IEnumerable type

我知道type將是數字,例如intshortlong等等。

我能夠吐出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
    }

  }

}

我無法創建typeIEnumerable並向其添加數字。

我怎樣才能做到這一點?

實際上,您在運行時就擁有該類型,因此您將需要使用反射來創建類型為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);
    }

使用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]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM