動態程式碼不支援擴充套件方法

static class Program
{
    static void Main()
    {
        dynamic dynamicObject = new ExpandoObject();

        string awesomeString = "Awesome";

        // Prints True
        Console.WriteLine(awesomeString.IsThisAwesome());

        dynamicObject.StringValue = awesomeString;

        // Prints True
        Console.WriteLine(StringExtensions.IsThisAwesome(dynamicObject.StringValue)); 
        
        // No compile time error or warning, but on runtime throws RuntimeBinderException
        Console.WriteLine(dynamicObject.StringValue.IsThisAwesome());
    }
}

static class StringExtensions
{
    public static bool IsThisAwesome(this string value)
    {
        return value.Equals("Awesome");
    }
}

[從動態程式碼呼叫擴充套件方法]不起作用的原因是因為在常規的非動態程式碼擴充套件方法中,通過對編譯器已知的所有類進行完全搜尋來處理具有匹配的擴充套件方法的靜態類。。搜尋按順序進行,基於名稱空間巢狀和每個名稱空間中可用的 using 指令。

這意味著為了正確解析動態擴充套件方法呼叫,DLR 必須在執行時知道原始碼中所有名稱空間巢狀和 using 指令是什麼。我們沒有將所有資訊編碼到呼叫站點中的機制。我們考慮發明這樣一種機制,但認為它的成本太高,並且產生太多的計劃風險值得。

資源