【问题标题】:Creating Array from type object从类型对象创建数组
【发布时间】:2018-08-23 22:30:26
【问题描述】:

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

【问题讨论】:

  • 我认为您需要Invoke 适当的ToArray 方法。
  • 另一种选择,看看我对stackoverflow.com/questions/51679179/…的回答。第二个选项为您提供对List&lt;object&gt; 的引用,您可以在其上调用ToArray()。但是,基础列表是正确的类型。我不知道有什么方法可以获得正确类型的对象引用 (List&lt;MyType&gt;),只有 List&lt;object&gt; 类型的引用
  • 我试图编辑我的评论,但没有时间。我的答案中的代码调用.ToList(),但可以轻松调用ToArray()。很快,您有一个MyType[] 类型的对象,但是,您无法获得对以这种方式键入的对象的引用;它将输入object[]。我不知道有什么方法可以获取正确类型的对象引用(又名变量)。

标签: c# arrays list generic-programming


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多