1

System.Reflection.PropertyInfo并且System.Reflection.ParameterInfo似乎没有公开任何方法来获取运行时使用的值来访问索引属性值。如果正确,这意味着必须提前知道索引值(即键) - 与字典不同,没有.Keys或类似的构造可以访问这些索引值。

我的目标是能够获取可通过字符串键访问的索引属性,并使用其键和值来构造新字典。有没有办法做到这一点?

4

3 回答 3

2

不幸的是,这是不可能的,除非班级“合作”。由于索引器和任何其他方法之间的唯一区别是索引器提供了一种特殊的语法,因此通常不可能遍历所有键,原因与不可能遍历函数返回的所有值的原因相同。

考虑有人编写一个“索引器”,它接受 astring并返回其反转值。在 C# 中,这将是一个有效的索引器;但是,它不能用于枚举所有可能的值。

但是,公开索引器的类通常实现IEnumerable<...>. 例如,IDictionary<K,V>exposes IEnumerable<KeyValuePair<K,V>>,它允许您枚举键及其对应的值。当然,类不必这样做,但是当它们这样做时,您的代码可以利用它来构造您需要的任何输出。

于 2013-06-25T14:25:45.047 回答
1

不,没有办法这样做——因为这样做没有意义。

与属性一样,索引器只是带有一些额外元数据的方法。所以这:

public int this[int x, int y]
{
    get { return x * y; } 
}

就像这样:

public int ComputeValue(int x, int y)
{
    return x * y;
}

如果索引器有一个设置器,那只是另一种方法,其中有一个额外的参数作为要设置的值。

看看上面的索引器——你会说“索引属性值”是什么?它可以使用任何 int值。这当然不是一个典型的索引器,但从语言的角度来看它是完全有效的。

如果你正在编写一个只接受一些输入的索引器,你可以选择公开它(就像Dictionary<,>公开一个Keys属性一样),但这取决于你。

于 2013-06-25T14:24:37.730 回答
0

有“没有钥匙”,因为你把它们藏在吸气剂里。键是什么取决于您的实现,例如您可以拥有一个字典类型的私有成员,然后将其包装在一个类中。

所以你可以做myClass["SomeKey"]而不是myClass.Values["SomeKey"]

即,您可能在此示例中隐藏了 Values 的实现方式Dictionary<String,int>

所以你需要添加一个方法来向你的类公开密钥,当然奖励球是你可能根本不需要反射。

于 2013-06-25T14:31:16.120 回答