Usando Linq para acceder a una objetos propiedades dentro de otro objeto

votos
0

Necesito obtener un valor de un objeto dentro de un otro objeto. Mi problema es que no puedo acceder a cualquier valor dentro del subobjeto, siempre me dan el valor del tipo de objeto en sí.

Código donde estoy acceder al objeto

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

Esto lleva de nuevo en la vista de los resultados

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

Necesito para acceder al elemento de [1] que contiene las propiedades siguientes (entre otros), y i necesidad de acceder al DisplayName

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

ScheduledTask es

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}
Publicado el 03/12/2019 a las 00:03
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Suponiendo x.FieldValuees una objectque podría intentar fundición para comprobar si es de 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: El asoperador es una especie de seguro de fundición que devolverá un valor nulo si el tipo de ejecución del argumento LHS no coincide con el tipo estático identificado por el argumento del lado derecho.

Respondida el 03/12/2019 a las 00:07
fuente por usuario

votos
2

No es necesario LINQ para acceder a un índice específico de una matriz.

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

Dado que la matriz contiene valores de diferentes tipos que asumir que tenemos una gran variedad de object. Por lo tanto hay que convertir al tipo de espera que sea capaz de campos específicos de acceso o propiedades.

En caso de que el valor es nulo o el tipo no coincide asproducirá null. Los operadores nulos-condicional ?.realizan una operación de miembro o acceso elemento sólo si un operando no es nulo y por lo demás de regreso null.

Si no se conoce el índice del valor requerido, se puede consultar mediante

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

Si está seguro del valor requerido está ahí y no es nulo, se puede eliminar el ?.

Respondida el 03/12/2019 a las 00:11
fuente por usuario

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