Использование Linq для получения доступа к объектам свойства внутри другого объекта

голоса
0

Мне нужно, чтобы получить значение из объекта в пределах другого объекта. Моя проблема в том, что я не могу получить доступ к любому значения внутри субобъекта, я всегда получаю значение объекта типа самого.

Код, где я имею доступ к объекту

var test = scheduledTask.Fields.Select(x => x.FieldValue);

Это возвращает в представлении результатов

[0] 10111
[1] {ObjectType.Extension} 

Мне нужно получить доступ к элементу [1], который содержит следующие свойства (среди прочих), и мне нужно получить доступ к DisplayName

{
DisplayName: MainMenu,
CategoryId: -1,
Id: 433
}

ScheduledTask является

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}
Задан 03/12/2019 в 00:03
источник пользователем
На других языках...                            


2 ответов

голоса
0

Предполагая , что x.FieldValueэто objectвы могли бы попробовать кастинг , чтобы проверить , если он имеет тип ObjectType.Extension:

var test = scheduledTask.Fields.Select(x => {
   var asExtension = x.FieldValue as ObjectType.Extension;
   if(asExtension != null) return asExtension.DisplayName;
   else return x.FieldValue;
});

ETA: asоператор является своим родом безопасного броском , который будет возвращать нуль , если тип времени выполнения LHS аргумента не соответствует статическому типу , идентифицированному аргумент РИТ.

Ответил 03/12/2019 в 00:07
источник пользователем

голоса
2

Вам не нужно LINQ для доступа к индексу для конкретного массива.

string name = (scheduledTask.Fields[1].FieldValue as ObjectType.Extension)?.DisplayName;

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

В случае , если значение равно нулю или тип не соответствует asдаст null. Нуль-условного оператора ?.выполняет член или элемент доступа операцию , только если операнд не равен нулю , а в противном случае возвращение null.

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

string name = (scheduledTask.Fields
    .Select(x => x.FieldValue)
    .OfType<ObjectType.Extension>()
    .FirstOrDefault()
)?.DisplayName;

Если вы уверены , что требуемое значение там и не пуста, вы можете опускать ?.

Ответил 03/12/2019 в 00:11
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more