Почему dynamic.ToString () возвращает что-то между строкой, а не строкой?
Я использую тип, полученный изDynamicObject
как строитель для некоторых строк. В конце я звонюToString
чтобы получить окончательный результат.
В этот момент я думал, что это даст мне нормальную строку, но эта строка как-то странно. Он ведет себя как один, когда я использую строковые функции, но ведет себя так, как будто я не знаю, что, что-то, ни строка, ни динамика.
Вот как я реализовалToString
на моего строителя
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();
}
}
Когда я запускаю это так
dynamic example = new Example();
Console.WriteLine(example.ToString().ToUpper());
результат верный:USERQUERY+EXAMPLE
(при исполнении в LINQPad)
Однако, если я назову вторую строку, как это
Console.WriteLine(example.ToString().Extension());
где
static class Extensions
{
public static string Extension(this string str)
{
return str.ToUpper();
}
}
приложение вылетает сRuntimeBinderException
поговорка
'string' не содержит определения для 'Extension'
но если я приведу результат, он снова работает
Console.WriteLine(((string)example.ToString()).Extension());
Может быть, еще один пример.
Console.WriteLine((string)example); // UserQuery+Example
но
Console.WriteLine(example); // DynamicObject UserQuery+Example
На самом деле вы никогда не сможете быть уверенными в том, что получите, пока не приведете его в строку.
Почему это происходит и есть ли способ избежать дополнительного броска и получить как-тореальный строка?