如何使用反射为数组字段和字典设置值



所有值都是在运行时以字符串形式出现的。

namespace ConsoleApp2
{
class myClass1
{
public string obj1;
public string obj2;
}
class myClass2
{
public myClass1[] fArray = new myClass1[2];
public Dictionary<string, string> dictObj = new Dictionary<string, string>();
}
class Program
{
static void Main(string[] args)
{
Type type = Type.GetType("ConsoleApp2.myClass2");
object myObj = Activator.CreateInstance(type);
FieldInfo fi = type.GetField("fArray");
IList arr = (IList)fi.GetValue(myObj);
char[] aray = { '[', ']' };
Type type2 = Type.GetType((fi.FieldType.FullName.Trim(aray)));
object newObj;
List<object> mylist = new List<object>();
{
newObj = Activator.CreateInstance(type2);
FieldInfo fi2 = type2.GetField("obj1");
fi2.SetValue(newObj, "some txt1");
FieldInfo fi3 = type2.GetField("obj2");
fi3.SetValue(newObj, "some txt2");
arr[0] = newObj;
}
{
newObj = Activator.CreateInstance(type2);
FieldInfo fi2 = type2.GetField("obj1");
fi2.SetValue(newObj, "some txt1");
FieldInfo fi3 = type2.GetField("obj2");
fi3.SetValue(newObj, "some txt2");
arr[1] = newObj;
}
}
}

通过这种方式,我可以将值正确地传递给"fArray"。这是正确的方式吗?或者我可以让它更简单。我想知道,我应该按照同样的方式将值传递给字典吗?

如果您知道它是一个数组,那么它必须实现数组的接口,包括索引器。为什么不将简单的强制转换作为接口之一呢。你知道数组中包含的类型吗?

IList<T>
ICollection<T>
IEnumerable<T> - does allow setting

如果您无法发现T,则使用

IListICollection

相反,使用var array = (myClass1[])fi1.GetValue();,然后按原样使用它;(

最新更新