#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; без фактического объявления вашего инкапсулированного объекта.