Как я могу получить значения параметров индекса из индексированных свойств с помощью отражения?
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>
возможно.
Таким образом, вам нужно добавить метод для выставления ключей вашему классу, конечно же, бонусный бал - вам может вообще не понадобиться рефлексия.