Usando Linq para aceder a uma objectos propriedades dentro de outro objeto

votos
0

Eu preciso para obter um valor de um objeto dentro de um outro objeto. Meu problema é que não consigo acessar quaisquer valores de dentro do sub-objeto, eu sempre obter o valor do tipo de objeto em si.

Código onde eu estou acessando o objeto

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

Isso traz de volta na exibição de resultados

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

Preciso para aceder a [1] elemento que contém as seguintes propriedades (entre outros), e i necessidade de aceder a DisplayName

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

ScheduledTask é

{
Fields: {Fields.Field[2]},
LastModifiedDate:null,
{Fields.Field[2]}
}
Publicado 03/12/2019 em 00:03
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Assumindo que x.FieldValueé um objectvocê poderia tentar lançar para verificar se ele é do 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: O asoperador é um tipo de seguro-elenco que retornará null se o tipo de tempo de execução do argumento LHS não coincide com o tipo estático identificado pelo argumento RHS.

Respondeu 03/12/2019 em 00:07
fonte usuário

votos
2

Você não precisa LINQ para acessar um índice específico de uma matriz.

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

Desde a matriz contém valores de diferentes tipos I assumir que temos um conjunto de object. Portanto, devemos converter para o tipo esperado para ser capaz de campos específicos de acesso ou propriedades.

Caso o valor é nulo ou o tipo não corresponde asrenderá null. Os operadores nulos-condicional ?.executa uma operação de membro ou elemento de acesso apenas se um operando é não nulo e caso contrário retorna null.

Se você não sabe o índice do valor necessário, você pode consultar com

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

Se você tem certeza que o valor necessário está lá e não nulo, você pode soltar o ?.

Respondeu 03/12/2019 em 00:11
fonte usuário

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