Estender um TypeConverter
-
19-08-2019 - |
Pergunta
A classe DateTimeConverter fornece conversões entre DateTime e string. Eu também gostaria de conversões de apoio entre DateTime e de casal.
De acordo com MSDN posso estender a classe DateTimeConverter para fazer isso - veja MSDN DateTimeConverter
Eu criei uma classe que herda de DateTimeConverter e fornece as substituições apropriadas para CanConvertTo, CanConvertFrom, etc.
Como posso ter certeza de que a estrutura usa meu conversor DateTime (DateTimeConverterEx) em vez do fornecido na BCL (DateTimeConverter) quando o código abaixo é chamado?
DateTime dt = DateTime.Now;
// This line returns a DateTimeConverter which I don't want.
// Would like to get a DateTimeConverterEx.
TypeConverter tc = TypeDescriptor.GetConverter(dt);
double dbl = (double)tc.ConvertTo(dt, typeof(double));
Graças.
Solução
Você precisa alocar o conversor. Em uma base de propriedade por propriedade, você pode usar:
[TypeConverter(typeof(DateTimeConverterEx))]
public DateTime Foo {get {...} set {...}}
Este seria, então o trabalho para o uso da forma:
var prop = TypeDescriptor.GetProperties(obj)["Foo"];
var converter = prop.Converter;
// as before, using "converter"
Isto irá funcionar para a maioria dos cenários de ligação comuns.
( Editar )
Para definir o conversor para qualquer DateTime
:
TypeDescriptor.AddAttributes(typeof(DateTime),
new TypeConverterAttribute(typeof(DateTimeConverterEx)));
Agora, o seu código de exemplo deve funcionar.