Utilizzando Linq per accedere a un oggetto all'interno di un altro oggetto proprietà

voti
0

Ho bisogno di ottenere un valore da un oggetto all'interno di un altro oggetto. Il mio problema è che non riesco ad accedere a tutti i valori all'interno del sotto-oggetto, ho sempre arrivare al valore dell'oggetto tipo stesso.

Codice dove sto accedere all'oggetto

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

Questo riporta nella visualizzazione dei risultati

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

Ho bisogno di accedere all'elemento [1], che contiene le seguenti proprietà (tra gli altri), e ho bisogno di accedere al DisplayName

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

ScheduledTask è

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}
È pubblicato 03/12/2019 alle 00:03
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

Supponendo x.FieldValueè un objectsi potrebbe provare a lanciare per verificare se è di tipo 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: L' asoperatore è una sorta di safe-cast che restituirà null se il tipo di runtime argomento LHS non corrisponde al tipo statico identificato dall'argomento RHS.

Risposto il 03/12/2019 a 00:07
fonte dall'utente

voti
2

Non è necessario LINQ per accedere a un indice specifico di un array.

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

Poiché la matrice contiene valori di tipi diversi I Supponiamo di avere una matrice di object. Quindi dobbiamo gettato al tipo dovrebbe essere in grado di campi specifici di accesso o proprietà.

Nel caso il valore è nullo o il tipo non corrisponde asprodurrà null. Gli operatori Null-condizionale ?.esegue un'operazione membro o accesso elemento solo se un operando non è nullo ed altrimenti ritorno null.

Se non si conosce l'indice del valore richiesto, è possibile interrogare con

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

Se sei sicuro che il valore richiesto è lì e non nullo, è possibile eliminare la ?.

Risposto il 03/12/2019 a 00:11
fonte dall'utente

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