gpt4 book ai didi

c# - 使用反射在 C# 中设置索引属性的值

转载 作者:可可西里 更新时间:2023-11-01 09:05:21 26 4
gpt4 key购买 nike

我有一个类有一个

ObservableCollection<int>

作为属性,我正在尝试更改该类实例的该属性内的值。这是我的代码,它会引发 TargetException:

object[] index = null;
var originalPropertyName = propertyName;
if (propertyName.Contains("[") && propertyName.Contains("]"))
{
index = new object[1];
index[0] = Convert.ToInt32(propertyName.Split('[')[1].Split(']')[0]);
propertyName = propertyName.Split('[')[0];
}
PropertyInfo pi = item.GetType().GetProperty(propertyName);
PropertyInfo opi = item.GetType().GetProperty(originalPropertyName);
Type pType = index != null ? pi.PropertyType.GetGenericArguments()[0] : pi.PropertyType;
if (pi != null)
{
object convertedValue = Convert.ChangeType(value, pType);
if (index == null)
{
item.GetType().GetProperty(propertyName).SetValue(item, convertedValue, null);
}
else
{
//PropertyInfo ipi = pi.PropertyType.GetProperties().Single(p => p.GetIndexParameters().Length > 0);
//var collection = pi.GetValue(item, index);
//collection.GetType().GetProperty("Value").SetValue(collection, convertedValue, null);
var _pi = pi.PropertyType.GetProperty("Item");
_pi.SetValue(pi, convertedValue, index);
}
}

上面没有显示 propertyName 是如何获得的,但在索引属性的情况下,它开始其生命周期为“IndexedProperty[10]”。

在“else”之后的评论中,您可以通过阅读其他一些 stackoverflow 帖子和其他论坛了解如何执行此操作,从而看到我尝试过的其他事情,但到目前为止我都失败了。有什么想法吗?

将属性转换为 ObservableCollection 是不可行的,因为我希望它是动态的。

整个事情的概念是拥有一个数据绑定(bind)的 DataGrid,并通过更新每个实例的适当属性使粘贴正常工作,无论这些属性是否被索引。非索引属性工作正常,但我无法让 ObservableCollection 属性工作。

最佳答案

具有 ObservableCollection<int> 的类因为属性实际上没有索引器传统意义上的索引属性。它只有一个非索引属性,本身 有一个索引器。所以你需要使用 GetValue从(不指定索引)开始,然后在结果上获取索引器。

基本上,您需要记住:

foo.People[10] = new Person();

相当于:

var people = foo.People; // Getter
people[10] = new Person(); // Indexed setter

看起来您几乎已经有了这段注释掉的代码:

//var collection = pi.GetValue(item, index);
//collection.GetType().GetProperty("Value").SetValue(collection, convertedValue, null);

...但是您在错误的位置应用了索引。你想要(我认为 - 这个问题不是很清楚):

var collection = pi.GetValue(item, null);
collection.GetType()
.GetProperty("Item") // Item is the normal name for an indexer
.SetValue(collection, convertedValue, index);

关于c# - 使用反射在 C# 中设置索引属性的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14052812/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com