LINQ Aby uzyskać dostęp do właściwości obiektów wewnątrz innego obiektu

głosy
0

Potrzebuję uzyskać wartość z obiektu wewnątrz innego obiektu. Moim problemem jest to, że nie może uzyskać dostępu do żadnych wartości od wewnątrz podobiektu, zawsze uzyskać wartość przedmiotu wpisać się.

Kod gdzie mam dostęp do obiektu

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

To prowadzi z powrotem w widoku wyników

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

Trzeba uzyskać dostęp [1], element, który składa się z następujących właściwości (między innymi), i mieć dostęp do DisplayName

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

ScheduledTask jest

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}
Utwórz 03/12/2019 o 00:03
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

Zakładając, x.FieldValueto objectmożna spróbować odlewania, aby sprawdzić czy to jest typu 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: the asoperator jest rodzajem bezpiecznej-cast, że zwróci wartość null, jeżeli typ runtime LHS argumentem nie zgadza się z typem statycznym zidentyfikowany przez argument RHS.

Odpowiedział 03/12/2019 o 00:07
źródło użytkownik

głosy
2

Nie trzeba LINQ uzyskać dostęp do konkretnego indeksu tablicy.

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

Ponieważ tablica zawiera wartości różnych typów Zakładam, że mamy tablicę object. Dlatego musimy rzucić do oczekiwanego typu móc pól specyficznych dostępu lub właściwości.

W przypadku, gdy wartość jest null lub typ nie pasuje asprzyniesie null. Operatorzy zerowe uwarunkowane ?.wykonuje operację użytkownika lub dostępu do elementów tylko jeżeli argument jest niezerowe i poza powrotu null.

Jeśli nie wiesz, indeks wymaganej wartości, można wyszukać z

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

Jeżeli jesteś pewien, że wymagana wartość jest tam i nie null, można upuścić ?.

Odpowiedział 03/12/2019 o 00:11
źródło użytkownik

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