[英]Why does dynamic.ToString() return something between a string and not a string?
我使用從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
實際上,在將其轉換為字符串之前,您永遠無法確定您將獲得什么。
為什么會發生這種情況,有沒有辦法避免額外的演員表,並以某種方式獲得真正的字符串?
那是因為調用dynamic
的ToString
是為了返回dynamic
而不是string
:
dynamic example = new Example();
// test will be typed as dynamic
var test = example.ToString();
當您在test
時調用ToUpper
時,它將使用動態綁定並在運行時解析為string.ToUpper
。 您必須轉換為具體類型以逃避動態類型。
擴展方法是編譯時功能,因此dynamic
類型不支持擴展方法 。 您仍然可以使用常規靜態方法調用語法來調用它。
Extensions.Extension(example.ToString());
但是再次 - example.ToString()
將返回dynamic
並且類型綁定將在運行時發生,以檢查它是否可以用作Extensions.Extension
調用的參數。 請查看此答案以獲取詳細信
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.