¿Por qué dynamic.ToString () devuelve algo entre una cadena y no una cadena?
Yo uso un tipo derivado de unDynamicObject
como constructor de algunas cadenas. Al final llamoToString
para obtener el resultado final
En este punto, pensé que me daría una cadena normal, pero esta cadena es de alguna manera extraña. Se comporta como uno cuando uso funciones de cadena, pero se comporta como si no supiera qué, algo que no sea una cadena ni una dinámica.
Así es como implementéToString
en mi constructor
public class Example : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out object result)
{
if (binder.ReturnType == typeof(string))
{
result = ToString();
return true;
}
result = null;
return false;
}
public override string ToString()
{
return base.ToString();
}
}
Cuando lo corro así
dynamic example = new Example();
Console.WriteLine(example.ToString().ToUpper());
El resultado es correcto:USERQUERY+EXAMPLE
(cuando se ejecuta en LINQPad)
Sin embargo, si llamo a la segunda línea así
Console.WriteLine(example.ToString().Extension());
dónde
static class Extensions
{
public static string Extension(this string str)
{
return str.ToUpper();
}
}
la aplicación se bloquea con unRuntimeBinderException
diciendo
'string' no contiene una definición para 'Extension'
pero si lanzo el resultado funciona de nuevo
Console.WriteLine(((string)example.ToString()).Extension());
Quizás un ejemplo más.
Console.WriteLine((string)example); // UserQuery+Example
pero
Console.WriteLine(example); // DynamicObject UserQuery+Example
En realidad, nunca puede estar seguro de lo que obtendrá hasta que lo convierta en cadena.
¿Por qué sucede esto? ¿Hay alguna forma de evitar el reparto adicional y obtener de alguna manerareal ¿cuerda?