Pergunta

eu tenho um Dictionary(TKey, TValue) Curti

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

e depois adiciono a essa matriz listar um tipo anônimo como este

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

Agora, como posso unir esse Var e acessar essas propriedades?

Foi útil?

Solução

Primeiro, você não está desconhecendo o tipo. Tipos anônimos são tipos de referência, não estruturas.

Mesmo que você possa tecnicamente criar instâncias do mesmo tipo fora do método em que foram declaradas (conforme a seção 7.5.10.6 da especificação do idioma C# 3.0, que afirma:

No mesmo programa, dois inicializadores de objeto anônimo que especificam uma sequência de propriedades dos mesmos nomes e tipos de tempo de compilação na mesma ordem produzirão instâncias do mesmo tipo anônimo.

) você não tem como conseguir o nome do tipo, que você precisa para realizar o elenco de Object de volta ao tipo que você criou. Você teria que recorrer a um Solução de elenco por exemplo que é inerentemente falho.

O expediente fundido é falho porque, do ponto de vista do design, todos os lugares que você deseja acessar o tipo fora da função que é declarado (e ainda dentro do mesmo módulo), você deve declarar efetivamente o tipo novamente.

É uma duplicação de esforço que leva ao design e implementação desleixados.

Se você está usando .NET 4.0, então você poderia Coloque a instância do objeto em uma variável dinâmica. No entanto, a principal desvantagem é a falta de verificação no tempo de compilação do acesso aos membros. Você pode facilmente errar o nome do membro e, em seguida, tem um erro de tempo de execução em vez de um erro de tempo de compilação.

Em última análise, Se você encontrar a necessidade de usar um tipo anônimo fora do método em que é declarado, a única boa solução é criar um tipo de concreto e substitua o tipo anônimo para o tipo de concreto.

Outras dicas

Existem várias maneiras.

Como os comentários parecem indicar que sugiro que você faça isso, deixe -me deixar claro: Você deve estar criando um tipo nomeado para o seu objeto, pois pretende transmiti -lo.

Primeiro, você pode usar a reflexão, que outra resposta aqui já apontou.

Outra maneira, que trata .NET para fornecer o tipo certo é conhecido como "elenco por exemplo", e vai algo assim: você precisa passar seu objeto através de uma chamada de método genérico, que retornará o objeto como o tipo certo , ao inferir o tipo certo para retornar.

Por exemplo, tente o seguinte:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

E para usá -lo:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

Para os dois ?? Pontos, você só precisa passar algo que se encaixe no tipo de dados para essas propriedades, os valores não serão usados.

Isso explora o fato de que vários tipos anônimos contendo exatamente as mesmas propriedades, do mesmo tipo, na mesma ordem, na mesma montagem, mapearão para o mesmo tipo único.

No entanto, a essa altura, você deve criar um tipo nomeado.

Um tipo anônimo tem escopo de método. Para passar por um tipo anônimo ou uma coleção que contém tipos anônimos, fora de um limite de método, você deve primeiro lançar o tipo para objeto. No entanto, isso derrota a forte digitação do tipo anônimo. Se você precisar armazenar seus resultados de consulta ou passar para fora do limite do método, considere usar uma estrutura ou classe ordinária nomeada em vez de um tipo anônimo.

Fonte: http://msdn.microsoft.com/en-us/library/bb397696.aspx

Não, você não pode. Você só pode acessar as propriedades usando a reflexão. O compilador não tem como saber qual era o tipo e, como é um tipo anônimo, você também não pode lançá -lo.

Se você estiver usando .NET 1.x - 3.x, deve usar a reflexão.

Se você usar o .NET 4.0, poderá usar um tipo dinâmico e chamar as propriedades esperadas.

Em nenhum dos casos, você precisa unbox; Isso é para tipos de valor. Tipos anônimos são sempre tipos de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top