Según the MSDN documentation:
Para que la conversión tenga éxito, valor debe implementar la interfaz IConvertible , porque el método simplemente envuelve una llamada a un método apropiado IConvertible. El método requiere la conversión de valor a tipo de conversión compatible.
En cuanto a la interfaz
IConvertible
, que tiene un método
ToType
. Podrías probar eso, tal vez? (Negación:. Yo no tengo Es sólo una idea.)
Editar: En su caso, parece que desea convertir de un string
a un Foo
.Dado que el tipo string
(obviamente) no define una conversión a Foo
en su implementación IConvertible
, creo que no tiene suerte.
actualización: No quiero sugerir que esta es la forma en que siempre debe acercarse a este tipo de problema, pero ...
Me tomó un vistazo al código de Convert.ChangeType
en Reflector . Es largo; No lo reproduciré aquí. Pero básicamente se está haciendo como dice la documentación: se sólo funciona si:
- El parámetro
value
es una instancia no nula de un tipo que implementa IConvertible
, o:
- El tipo del parámetro
value
y el parámetro conversionType
es el mismo (entonces: Convert.ChangeType(myFoo, typeof(Foo))
también funcionaría, aunque sería bastante inútil).
entonces, ciclos a través de todos los tipos soportados por IConvertible
(que obviamente no incluye ninguna tipos definidos por el usuario) y en última instancia, utiliza ToType
como un repliegue.
Por lo tanto, tenemos que mirar la implementación del tipo string
de ToType
.
Lamentablemente, es una línea desafortunado:
return Convert.DefaultToType(this, type, provider);
¿Qué DefaultToType
hacer? Exactamente lo mismo que ChangeType
(menos la caída de ToType
, obviamente para evitar la recursión infinita).
Así que esto simplemente no va a funcionar.
Si está absolutamente vinculado a esta biblioteca de terceros que usa Convert.ChangeType
detrás de escena, le recomendaría contactar al desarrollador de la biblioteca y pedirle que extienda su API de alguna manera que le permita lograr lo que está intentando cumplir. Algunas posibilidades podrían ser:
- La aceptación de un parámetro o
Converter<string, T>
Func<string, T>
delegado opcional, según lo sugerido por Ben Voigt en un comentario.
- aceptar un parámetro
TypeConverter
- La aceptación de un parámetro de algún tipo que implementa una interfaz como
IParser<T>
De todos modos, lo mejor de la suerte.
Debo señalar que probé el operador implícito y no funcionó. – blu
Tenga en cuenta que puede tener un operador implícito en cualquier dirección, pero todavía es una característica del compilador de C# y no va a ser utilizado por código ya compilado. Lo más probable es que tenga que mirar y ver si la biblioteca de terceros le permite crear los objetos usted mismo, ¿tal vez hay una sobrecarga que acepta un delegado 'Converter'? –