Получить коллекцию значений из const свойств структуры

#c# #reflection

#c# #отражение

Вопрос:

У меня есть структура, которая выглядит следующим образом:

 public struct MyStruct
{
    public const string Property1 = "blah blah blah";
    public const string Property2 = "foo";
    public const string Property3 = "bar";
}
  

Я хочу программно получить коллекцию значений const свойств MyStruct.
До сих пор я пробовал это без успеха:

 var x = from d in typeof(MyStruct).GetProperties()
                    select d.GetConstantValue();
  

У кого-нибудь есть какие-нибудь идеи? Спасибо.

РЕДАКТИРОВАТЬ: Вот что в конечном итоге сработало для меня:

 from d in typeof(MyStruct).GetFields()
select d.GetValue(new MyStruct());
  

Спасибо Джонатану Хенсону и Джаредпару за всю вашу помощь!

Ответ №1:

Это поля, а не свойства, и, следовательно, вам нужно использовать GetFields метод

     var x = from d in typeof(MyStruct).GetFields()
            select d.GetRawConstantValue();
  

Также я полагаю, что вы ищете метод GetRawConstantValue вместо GetConstantValue

Комментарии:

1. Я знаю, что это старый вопрос / ответ, но спасибо. Вы первый, кто указывает, что это поля, а не свойства.

2. Когда я пытаюсь получить доступ к var x, я получаю исключение: «Операция недопустима из-за текущего состояния объекта». — есть идеи?

Ответ №2:

Вот немного другая версия для получения фактического массива строк:

 string[] myStrings = typeof(MyStruct).GetFields()
                     .Select(a => a.GetRawConstantValue()
                     .ToString()).ToArray();
  

Ответ №3:

GetProperties вернет ваши свойства. Свойства имеют методы get и / или set.

На данный момент ваша структура не имеет свойств. Если вам нужны свойства, попробуйте:

 private const string property1 = "blah blah";

public string Property1
{
    get { return property1; }
}
  

кроме того, вы могли бы использовать GetMembers() для возврата всех ваших элементов, это вернуло бы ваши «свойства» в ваш текущий код.

Комментарии:

1. вы также можете задавать значения с помощью такого свойства, как: частная строка property1; общедоступная строка Property1 { get { return property1; } set { property1 = value; } } Кроме того, в C # версии 3.5 и более поздних версиях вы можете просто выполнять get; и set; без фактического объявления вашего инкапсулированного объекта.