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