簡體   English   中英

為什么dynamic.ToString()在字符串而不是字符串之間返回一些東西?

[英]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 

實際上,在將其轉換為字符串之前,您永遠無法確定您將獲得什么。


為什么會發生這種情況,有沒有辦法避免額外的演員表,並以某種方式獲得真正的字符串?

那是因為調用dynamicToString是為了返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM