Как я могу получить значения параметров индекса из индексированных свойств с помощью отражения?

System.Reflection.PropertyInfo а также System.Reflection.ParameterInfo Похоже, что нет никакого способа получить значения, используемые во время выполнения для доступа к индексированным значениям свойств. Если все правильно, это означает, что нужно знать значения индекса (т. Е. Ключи) заранее - в отличие от словаря, здесь нет .Keys или аналогичная конструкция для доступа к этим значениям индекса.

Моя цель - иметь возможность получить индексированное свойство, доступное через строковый ключ, и использовать его ключи и значения для создания нового словаря. Есть какой-либо способ сделать это?

3 ответа

К сожалению, это невозможно, если класс "не сотрудничает". Поскольку единственное различие между индексатором и любым другим методом состоит в том, что индексатор предлагает специальный синтаксис, перебор всех ключей, как правило, невозможен по тем же причинам, по которым невозможно просмотреть все значения, возвращаемые функцией.

Представьте, что кто-то пишет "индексатор", который stringи возвращает его обратное значение. В C# это будет действительный индексатор; однако это было бы непригодно для целей перечисления всех его возможных значений.

Однако классы, которые предоставляют индексаторы, часто реализуют IEnumerable<...>, Например, IDictionary<K,V> разоблачений IEnumerable<KeyValuePair<K,V>>, что позволяет перечислять ключи вместе с их соответствующими значениями. Конечно, классы не обязаны это делать, но когда они это делают, ваш код может использовать это для создания любого вывода, который вам нужен.

Нет, это невозможно сделать - потому что это бессмысленно.

Как и свойства, индексаторы - это просто методы с некоторыми дополнительными метаданными. Итак, это:

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

Это просто так:

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

Если у индексатора есть установщик, это просто еще один метод с дополнительным параметром в качестве устанавливаемого значения.

Посмотрите на индексатор выше - что бы вы назвали "индексированными значениями свойств"? Может работать с любым int ценности. Это, конечно, не типичный индексатор, но он полностью действителен с точки зрения языка.

Если вы пишете индексатор, который принимает только некоторые входные данные, вы можете выбрать, чтобы показать это (так же, как Dictionary<,> подвергает Keys собственность), но это зависит от вас.

Там нет "ключей", потому что вы спрятали их в добытчике. Что это за ключи, зависит от вашей реализации, например, вы можете иметь закрытый член типа Dictionary, а затем обернуть его в класс.

чтобы ты мог сделать myClass["SomeKey"] вместо myClass.Values["SomeKey"]

то есть вы скрываете, как значения реализуются в этом примере Dictionary<String,int> возможно.

Таким образом, вам нужно добавить метод для выставления ключей вашему классу, конечно же, бонусный бал - вам может вообще не понадобиться рефлексия.

Другие вопросы по тегам