Estou criando um aplicativo Windows Forms simples usando C # express 2008. Sou um desenvolvedor C ++ experiente, mas sou praticamente novo em C # e .NET.
No momento, estou armazenando algumas das configurações simples do meu aplicativo usando o designer de configurações e um código como este:
// Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
// Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
Agora eu gostaria de armazenar um array de ints ( int[]
), ou possivelmente uma Lista de ints ( List< int >
), como uma configuração. No entanto, não consigo descobrir como fazer isso. Eu pesquisei a documentação, stackoverflow e google, e não consigo encontrar uma explicação decente de como fazer isso.
Meu palpite com base nos exemplos esparsos que encontrei é que tenho que criar uma classe que seja serializável que envolva meu array ou Lista, e então poderei usar esse tipo no designer de configurações. No entanto, não sei exatamente como fazer isso.
int[]
seria semelhante a esta (exceto bem impressa):<setting name="SomeTestSetting" serializeAs="String"><value><ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><int>1</int><int>2</int><int>3</int></ArrayOfInt></value></setting>
armazenar:
string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());
para recriar:
int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();
Edit: sugestão de Abel!
fonte
System.Linq
adicionar seus usos / importações para que o truque acima funcione.Existe uma outra maneira de obter esse resultado que é muito mais limpo no uso, mas requer mais código. Minha implementação de um tipo personalizado e conversor de tipo o seguinte código é possível:
Para conseguir isso, você precisa de um tipo com um conversor de tipo que permite a conversão de e para strings. Você faz isso decorando o tipo com o TypeConverterAttribute:
Em seguida, implementar este conversor de tipo como uma derivação de TypeConverter:
Ao fornecer alguns métodos de conveniência na classe MyNumberArray, podemos atribuir com segurança a e a partir de List, a classe completa seria semelhante a:
Por último, para usar isso nas configurações, você adiciona as classes acima a uma montagem e compila. Em seu editor Settings.settings, você simplesmente clica na opção "Browse" e seleciona a classe MyNumberArray e pronto.
Novamente, isso é muito mais código; entretanto, pode ser aplicado a tipos de dados muito mais complicados do que uma simples matriz.
fonte
Especifique a configuração como System.Collections.ArrayList e:
fonte
Uma solução simples é definir o valor padrão de uma configuração como nulo na propriedade, mas no construtor verifique se a propriedade é nula e, em caso afirmativo, defina-a com seu valor padrão real. Então, se você quiser uma matriz de ints:
Parece meio hacky, mas é limpo e funciona como desejado, já que as propriedades são inicializadas com suas últimas configurações (ou padrão) antes que o construtor seja chamado.
fonte
Usado
System.Object
.Exemplo:
Extrair:
fonte
Acho que você está certo sobre serializar suas configurações. Veja minha resposta a esta pergunta para um exemplo:
Técnicas para compartilhar uma configuração entre dois aplicativos?
Você teria uma propriedade que é uma matriz, como esta:
fonte
Faça algumas funções que convertam um array int em uma string, mas entre cada um coloque um caractere como "" (espaço).
Portanto, se a matriz for {1,34,546,56} a string seria "1 34 645 56"
fonte