【问题标题】:C# reflection : How to set nested Property of nested ListsC# 反射:如何设置嵌套列表的嵌套属性
【发布时间】:2018-07-19 22:51:21
【问题描述】:

想象下面的“路径”:

MyObject.MyFirstList[0].MySecondList[0].MyProperty = "你好"

MyProperty 是字符串类型。 在编译时没有任何类型是已知的,只有在运行时通过程序集的反射才知道。

我拥有一切,但我无法使用 SetValue 在第一个列表上设置第二个列表。我总是得到空引用异常或“目标类型不匹配”。

到目前为止我所尝试的:

迭代1:

var constructedList = Activator.CreateInstance(constructedListType);
target.GetType().GetProperty(propertyToAdd).SetValue(target, constructedList)

迭代 2:

同样的方法,同样有效。所以现在我们有了 MyObject.MyFirstList[0].MySecondList[]

迭代 3:TODO:创建 MySecondList 的第一个对象的实例并将其 MyProperty-property 设置为创建的属性:

var target = Activator.CreateInstance(typeOfItem);
target.GetType().GetProperty(propertyToAdd)?.SetValue(target, null);

所以总结一下这个问题:

这行得通:

someInstance.GetType().GetProperty(someProperty).SetValue(someInstance, objToSet);

为什么这样的事情不起作用?或者是 - 如果是,如何?

someInstance.GetType().GetProperty(someList.listInsideSomeList.finalProperty).SetValue(...);

【问题讨论】:

  • 展示你目前为实现这一目标所做的尝试。

标签: c# list generics reflection


【解决方案1】:

简而言之,反射为您提供了获取类型信息的方法。它不能用于引用其他类型的属性(如上一个示例所示)。

你在正确的轨道上,但你需要在你的道路上从右到左。所以你有一些嵌套的属性。你先创建嵌套对象,如:

var objNested = Activator.CreateInstance(objNestedType);
objNestedType.GetProperty(nestedPropertyName).SetValue(objNested, value);

然后将新创建的对象添加到其“父对象”:

var objBase = Activator.CreateInstance(objBaseType);
objBaseType.GetProperty(basePropertyName).SetValue(objBase, objNested);

数组有点不同。反射希望您在使用propertyinfo.SetValue 时记下最终值,如果是数组,则这是整个数组值。为此,您可以使用 Array.CreateInstance(typeof(arrayType), arrayLength) 创建一个新数组并使用 'SetValue(object, index)' 方法设置其内容。

【讨论】:

  • 我试图做这样的事情但没有取得多大成功——首先构建嵌套对象然后然后将其附加到基础对象的建议是我的部分不见了。
猜你喜欢
  • 2023-04-10
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
相关资源
最近更新 更多