【发布时间】:2021-07-23 16:45:31
【问题描述】:
我想创建一个函数来动态分配数组成员元素。数组的大小不同,它们来自文件。 我使用反射从 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!!");
}
}
}
}
}
【问题讨论】:
-
请添加您如何获得
arrayFieldInfo的代码以及您的方法失败的类型。目前不能reproduce。 -
您发布的代码不会引发您声称的异常。但是,它确实 具有经典的“通过反射设置结构字段”错误,您正在对原始值的盒装 副本 进行操作,因此该字段的值在原值不变。查看副本。
标签: c# reflection