Atualmente, tenho um WebSocket entre JavaScript e um servidor programado em C #. Em JavaScript, eu posso transmitir dados facilmente usando uma matriz associativa:
var data = {'test': 'val',
'test2': 'val2'};
Para representar esse objeto de dados no lado do servidor, eu uso a Dictionary<string, string>
, mas isso é mais "caro para digitar" do que no JavaScript:
Dictionary<string, string> data = new Dictionary<string,string>();
data.Add("test", "val");
data.Add("test2", "val2");
Existe algum tipo de notação literal para matrizes / Dictionary
s associativas em C #?
c#
dictionary
literals
pimvdb
fonte
fonte
Respostas:
Você usa a sintaxe do inicializador de coleção , mas ainda precisa criar um
new Dictionary<string, string>
objeto, pois a sintaxe do atalho é traduzida para váriasAdd()
chamadas (como o seu código):No C # 6, agora você tem a opção de usar uma sintaxe mais intuitiva com o Dictionary e com qualquer outro tipo que suporte indexadores . A declaração acima pode ser reescrita como:
Diferentemente dos inicializadores de coleção, isso chama o indexador sob o capô, em vez de um
Add()
método apropriado .fonte
Dictionary<string, string>
itens? Parece bastante redundante, mas posso estar errado. Edit: Esta parece uma maneira mais preferível, de fato, obrigado.var
, o compilador inferirá o tipo donew
. Eu editei minha resposta.Dictionary<string, string>
,. Meu código originalmente declarou o tipo, eu havia mudado paravar
depois do comentário dele.Embora a resposta do inicializador de dicionário esteja totalmente correta, há outra abordagem que eu indicaria (mas talvez eu não a recomende). Se seu objetivo é fornecer uso conciso da API, você pode usar objetos anônimos.
A variável "data" é então de um tipo anônimo "indizível", então você só pode passar isso como
System.Object
. Você pode escrever um código que pode transformar um objeto anônimo em um dicionário. Esse código dependeria da reflexão, o que potencialmente seria lento. No entanto, você pode usarSystem.Reflection.Emit
ouSystem.Linq.Expressions
compilar e armazenar em cache um delegado que tornaria as chamadas subseqüentes muito mais rápidas.As APIs do MVC do Asp.net usam essa técnica em vários lugares que eu já vi. Muitos Assistentes de HTML têm sobrecargas que aceitam um objeto ou um dicionário. Presumo que o objetivo do design da API seja o mesmo que você procura; sintaxe concisa na chamada do método.
fonte
Usando
DynamicObject
, não é tão difícil criar um inicializador de dicionário mais simples.Imagine que você deseja chamar o seguinte método
usando uma sintaxe literal como
Isso pode ser conseguido criando um objeto dinâmico como este
fonte
Usar literais do dicionário (proposta C # 9)
O C # 9 apresenta uma sintaxe mais simples para criar
Dictionary<TKey,TValue>
objetos inicializados sem precisar especificar o nome do tipo Dicionário ou os parâmetros de tipo. Os parâmetros de tipo para o dicionário são inferidos usando as regras existentes usadas para inferência de tipo de matriz.Essa sintaxe simplifica o trabalho com dicionários em C # e remove o código redundante.
Você pode acompanhar o problema no GitHub (e aqui está o marco do C # 9 ).
Editar: esta proposta está atualmente rejeitada :
fonte