C#反射: How to set nested Property of nested Lists

标签 c# list generics reflection

想象一下以下“路径”:

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/

相关文章:

c# - Visual Studio 2013 和 Resharper 中的自动命名空间

c# - 如何避免继承类必须传递基类构造函数参数

python - 在 Python 中减去两个列表

通配符上的 Java 泛型插入

c# - 为什么接口(interface)不能用作类型参数?

c# - 从 Span<byte> 获取 Int32

c# - .NET Core EF,何时避免异步数据库调用

java - 在对键排序后对列表进行排序

python 从文件中删除特定行

c# - 通用列表上的 is-operator