动态代码不支持扩展方法

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 指令是什么。我们没有将所有信息编码到呼叫站点中的机制。我们考虑发明这样一种机制,但认为它的成本太高,并且产生太多的计划风险值得。

资源