从类型对象创建数组

Creating Array from type object

我正在尝试创建一个已知类型的数组,当前设置为 Type。我已经能够创建该类型的 IList,但我仍然能够将其转换为该类型的数组,取而代之的是 object[]

object propertyValue; //This needs to be an object since it can be set to any object
Type currentType = PropertyInfo.GetType(); //Example: System.String
propertyValue = GetArray(reader, currentType); //What would this look like to make currentType work?
//Reflection occuring later to set propertyValue to attribute of String[]

这是我使用 IList 得到的结果,这里的问题是不确定如何将其转换为 currentType 的数组。我也更喜欢只取回一个数组:

private IList GetArray(Reader reader, Type currentType)
{
  var returnList = createList(currentType); 
  //reader loop that appends to list
  return returnList;
}

public IList createList(Type currentType)
{
  Type genericListType = typeof(List<>).MakeGenericType(currentType);
  return (IList)Activator.CreateInstance(genericListType);
}

这里有一个更简单的方法:

var stringType = typeof(string);
var anArray = System.Array.CreateInstance(stringType, 5);
var arrayAsArray = (object[]) anArray;

此时,变量 anArray 被键入为 object,但指的是一个包含 5 个字符串的数组。变量 arrayAsArray 的类型为 object[],它指的是相同的字符串数组。

你不能得到的(据我所知)是一个变量,它键入 MyType[] 引用 MyType 个实例的数组,如果你只有 typeof(MyType) .编译器在编译时创建类型化对象引用,你不能参与 space.

.NET Framework 的一个特性(或缺陷,取决于您的外观)是数组是协变的。数组协变有很多问题(例如,由于编译器认为您有一个“object[]”,它会让您尝试将一个 Elephant 实例添加到您的字符串数组中)。但是,在这种情况下,它使您的代码可用,即使它有些脆弱。

您似乎想从对象流中生成指定类型的数组。如果是这种情况,那么我会这样处理:

void Main()
{
    var file = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "TestFile.txt");

    var array = GetValues<String>(file).ToArray();

    foreach (var item in array)
    {
        Console.WriteLine(item);
    }
}

private IEnumerable<T> GetValues<T>(String file)
{
    using (StreamReader stream = new StreamReader(file))
    {
        while (true)
        {
            var next = stream.ReadLine();
            if (next == null)
            {
                break;
            }
            yield return (T)Convert.ChangeType(next, typeof(T));
        }
    }
}