从类型对象创建数组

时间:2018-08-23 22:30:27

标签: c# arrays list generic-programming

我正在尝试创建一个已知类型且当前设置为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);
}

2 个答案:

答案 0 :(得分:0)

这是一个更简单的方法:

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

这时,变量anArray的类型为object,但引用了一个由5个字符串组成的数组。变量arrayAsArray的类型为object[],它引用相同的字符串数组。

(据我所知),如果您只有MyType[],那么您无法获得的是一个变量MyType,该变量引用typeof(MyType)实例数组。编译器在编译时创建类型化的对象引用,因此您不必在那个空间中发挥作用。

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

答案 1 :(得分:0)

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

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));
        }
    }
}