Eu tenho uma classe que quero usar para armazenar "propriedades" para outra classe. Essas propriedades simplesmente têm um nome e um valor. Idealmente, o que eu gostaria é poder adicionar propriedades digitadas , para que o "valor" retornado seja sempre do tipo que eu quero que seja.
O tipo deve sempre ser um primitivo. Esta classe subclasses uma classe abstrata que basicamente armazena o nome e o valor como string. A ideia é que essa subclasse adicione um pouco de segurança de tipo à classe base (além de me poupar em algumas conversões).
Então, eu criei uma classe que é (aproximadamente) isso:
public class TypedProperty<DataType> : Property
{
public DataType TypedValue
{
get { // Having problems here! }
set { base.Value = value.ToString();}
}
}
Então a questão é:
Existe uma maneira "genérica" de converter de string de volta para um primitivo?
Não consigo encontrar nenhuma interface genérica que vincule a conversão em geral (algo como ITryParsable teria sido o ideal!).
fonte
Respostas:
Não tenho certeza se entendi suas intenções corretamente, mas vamos ver se essa ajuda.
fonte
Convert.ChangeType
não seja uma solução muito universal e extensível, ele funciona para os tipos mais básicos. se for necessário algo melhor, não há problema em agrupar esse método em algo maior, como sugerido por Tim, ou usar um método de conversão diferente.O método de lubos hasko falha para anuláveis. O método abaixo funcionará para anuláveis. Eu não pensei nisso, no entanto. Encontrei-o no Google: http://web.archive.org/web/20101214042641/http://dogaoztuzun.com/post/C-Generic-Type-Conversion.aspx Crédito para "Tuna Toksoz"
Uso primeiro:
A turma está abaixo.
fonte
tc
(aTypeConverter
) apenas uma vez.TypeConverter
é lento porque usa reflexão para procurar o arquivoTypeConverterAttribute
. Se você inicializar um únicoTypeConverter
campo privado , poderá reutilizarTypeConverter
várias vezes.object
, lança uma exceção. Consegui contornar isso usando `if (typeof (T) .IsPrimitive) {return TConverter.ChangeType <T> (StringValue); } else {objeto o = (objeto) StringValue; voltou para; } `como substituto para a amostra de usoTConverter.ChangeType<T>(StringValue)
Para muitos tipos (número inteiro, duplo, DateTime etc.), existe um método de Análise estático. Você pode invocá-lo usando reflexão:
fonte
TypeDescriptor
é uma classe que possui um métodoGetConvertor
que aceita umType
objeto e, em seguida, você pode chamar oConvertFrom
método para converter ovalue
objeto especificado.fonte
Você poderia usar uma construção como uma classe de características . Dessa forma, você teria uma classe auxiliar parametrizada que sabe como converter uma string em um valor de seu próprio tipo. Então seu getter pode ficar assim:
Agora, devo salientar que minha experiência com tipos parametrizados é limitada ao C ++ e seus modelos, mas imagino que haja alguma maneira de fazer o mesmo tipo de coisa usando genéricos C #.
fonte
Verifique a estática
Nullable.GetUnderlyingType
. - Se o tipo subjacente for nulo, o parâmetro do modelo não seráNullable
, e podemos usá-lo diretamente. - Se o tipo subjacente não for nulo, use o tipo subjacente na conversão.Parece funcionar para mim:
fonte
Com inspiração na resposta de Bob , essas extensões também suportam conversão de valor nulo e toda conversão primitiva de volta e quarta.
Exemplos
fonte
Estou usando a conversão através de um objeto. É um pouco mais simples.
fonte
Eu usei a resposta lobos e funciona. Mas tive um problema com a conversão de duplas devido às configurações de cultura. Então eu adicionei
fonte
Mais uma variação. Manipula Anuláveis, bem como situações em que a sequência é nula e T não é anulável.
fonte
Você pode fazer isso em uma linha, como abaixo:
Feliz codificação;)
fonte