从类型对象创建数组
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));
}
}
}
我正在尝试创建一个已知类型的数组,当前设置为 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));
}
}
}