我正在使用.Net 2013,Windows7。我可以使用反射设置和获取单个值。当我尝试使用反射在数组中设置值时,我无法这样做。使用反射我能够获取数组中的值。
我发现似乎是在数组中设置值的解决方法,但我不明白为什么SetValue函数不起作用。以下是我的代码。
property = type.GetProperty("propDeviceMessageMask", BindingFlags.Public | BindingFlags.Instance);
if (property != null)
{
DEVICE_MESSAGE_MASK_Types[] value = (DEVICE_MESSAGE_MASK_Types[])property.GetValue(device, null);
value[0] = DEVICE_MESSAGE_MASK_Types.Disabled;
value[1] = DEVICE_MESSAGE_MASK_Types.Disabled;
value[2] = DEVICE_MESSAGE_MASK_Types.Disabled;
value[3] = DEVICE_MESSAGE_MASK_Types.Disabled;
property.SetValue(device, DEVICE_MESSAGE_MASK_Types.Disabled, new object[] { (int)4 });
}
propDeviceMessageMask是一个包含8个DEVICE_MESSAGE_MASK_Types的数组。我可以使用GetValue函数获取整个数组。我可以使用索引0-3编辑值。当我尝试使用SetValue函数更新索引4时,我在TargetParameterCountException中得到参数计数不匹配。
答案 0 :(得分:0)
该异常意味着索引中的参数数量与索引属性所采用的参数数量不匹配。所以在你的情况下,数字是4,但数组没有这个索引。试试这个,它应该有效:
// valid indexes are 0, 1, 2 and 3
property.SetValue(device, DEVICE_MESSAGE_MASK_Types.Disabled, new object[] { (int)3 });
有关如何使用SetValue
方法以及如何解释MSDN中抛出异常的更多详细信息:https://msdn.microsoft.com/en-us/library/xb5dd1f1(v=vs.110).aspx
答案 1 :(得分:0)
首先,要了解arrays在.NET中是固定大小的。如果您的propDeviceMessageMask
数组最初有8个项,那么您应该可以使用与索引0到3相同的语法设置索引0到7的值:
value[4] = DEVICE_MESSAGE_MASK_Types.Disabled;
但是,如果您的数组最初只有4个项目,那么您可以在索引0到3中设置这些值,但不能在索引4(第五个项目)处设置值。如果需要存储5个项目,则必须分配5个项目的新数组,并将前4个值复制到新数组中。然后,您可以将新数组分配给属性。
或者,如果您可以修改原始类,则应该使用List<T>
,它可以比数组更优雅地处理动态添加/删除项目。
其次,听起来你有一个如下定义的属性:
public DEVICE_MESSAGE_MASK_Types[] propDeviceMessageMask { get; set; }
重要的是要意识到非常与索引器属性不同(即使语法在某些方面类似),它们看起来像这样:
public DEVICE_MESSAGE_MASK_Types this[int index] { ... }
index
/ GetValue
方法中的SetValue
参数只能用于后一种属性。因此,要将此已修改数组的值设置回原始对象,您必须将index
参数保留为null:
property.SetValue(device, value, null);
答案 2 :(得分:0)
数组类型的属性与索引属性不同,尽管两者的“通常”源代码看起来像
obj.prop[index]
在做反思时,差异很重要。