想象一下以下“路径”:
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 属性设置为创建的属性:
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(...);
最佳答案
简而言之,反射为您提供了获取类型信息的方法。它不能用于引用其他类型的属性(如上一个示例所示)。
你走在正确的轨道上,但你需要从右向左走。所以你有一些嵌套的属性。首先创建嵌套对象,如:
var objNested = Activator.CreateInstance(objNestedType);
objNestedType.GetProperty(nestedPropertyName).SetValue(objNested, value);
然后将新创建的对象添加到其“父对象”:
var objBase = Activator.CreateInstance(objBaseType);
objBaseType.GetProperty(basePropertyName).SetValue(objBase, objNested);
数组有点不同。 Reflection 希望您在使用 propertyinfo.SetValue
时写下最终值,如果是数组,则这是整个数组值。为此,您可以使用 Array.CreateInstance(typeof(arrayType), arrayLength)
创建一个新数组并使用“SetValue(object, index)”方法设置其内容。
关于C#反射: How to set nested Property of nested Lists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48701230/