【问题标题】:How can I get index-parameter values from indexed properties via reflection?如何通过反射从索引属性中获取索引参数值?
【发布时间】:2013-06-25 14:19:45
【问题描述】:

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

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

【问题讨论】:

    标签: c# properties indexed indexed-properties


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢。看来我唯一的办法是遍历所有可能的字符串......必须测试性能影响。
    • @Iucounu “所有可能的字符串”的集合很快就会变得太大,即使您的限制只有 10..15 个 UNICODE-16 字符。
    【解决方案2】:

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

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

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

    就是这样:

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

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

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

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

    【讨论】:

    • 谢谢。看来我唯一的办法是遍历所有可能的字符串......必须测试性能影响。
    • 那么在这种情况下“所有可能的字符串”是什么意思?如果您能提供更多背景信息,我们或许可以提供更多建议。从根本上说,索引器可以接受任何字符串...
    【解决方案3】:

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

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

    也就是说,你可能隐藏了 Dictionary<String,int> 在这个例子中是如何实现 Values 的。

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

    【讨论】:

    • 谢谢,托尼。如果我能控制班级,那将是一个不错的选择。
    • 好吧,我确实假设你这样做了,并且至少把我弄得一团糟。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多