我想创建一个函数来动态分配数组成员元素。数组的大小不同,它们来自文件。 我使用反射从 struct 对象中获取数组成员元素,并将其分配给从 Array.CreateInstance() 函数创建的新数组。
private static void initArray<T>(ref T item,BinaryReader br){
var fields = item.GetType().GetFields(Bindingflags.Public | Bindingflags.NonPublic | Bindingflags.Instance);
//....
// get array field from object
//...
arrayType = arrayFieldInfo.FiledType;
int length = br.ReadInt32();
Array arr = activator.CreateInstance(arrayType,length) as Array;
arrayFieldInfo.Setvalue(item,arr); // this code not work
}
我发现由于此错误该函数不起作用:错误 CS0266:无法隐式转换类型“System.Array”。请帮帮我。
---更新--- 我把示例代码放在这里
struct Person
{
public Address[] addresses;
}
struct Address
{
public int nCode;
public string homeAddress;
}
class Program
{
static void Main(string[] args)
{
Person p = new Person();
int nSize = 100;//hard code instead of read from file
var fields = typeof(Person).GetFields(System.Reflection.Bindingflags.Public | System.Reflection.Bindingflags.NonPublic | System.Reflection.Bindingflags.Instance);
foreach (var fieldInfo in fields)
{
if (fieldInfo.FieldType.IsArray)
{
Array arr = Array.CreateInstance(fieldInfo.FieldType.GetElementType(),nSize);
//1. Using reflection to set value
fieldInfo.Setvalue(p,arr);
if(p.addresses == null)
{
Console.WriteLine("Reflection-Not success");
}
else
{
Console.WriteLine("Reflection-success");
}
//2. Using assignment operator with explicit cast
p.addresses = (Address[])arr;
if (p.addresses == null)
{
Console.WriteLine("cast-Not success");
}
else
{
Console.WriteLine("cast-Success!!");
}
}
}
}
}