在 C# 中创建动态扩展方法?

Creating a dynamic extension method in C#?

是否可以解决此错误:

public static class LayoutExtensions
{
    /// <summary>
    /// Verifies if an object is DynamicNull or just has a null value.
    /// </summary>
    public static bool IsDynamicNull(this dynamic obj)
    {
        return (obj == null || obj is DynamicNull);
    }

编译时间

Error: The first parameter of an extension method 
       cannot be of type 'dynamic'  

对象 class 派生的所有 classes。也许试试这个代码

public static bool IsDynamicNull(this object obj)
{
    return (obj == null || obj is DynamicNull);
}

没有。参见

当您使用 dynamic 对象时,您不能通过 "extension method syntax" 调用扩展方法。说清楚:

int[] arr = new int[5];
int first1 = arr.First(); // extension method syntax, OK
int first2 = Enumerable.First(arr); // plain syntax, OK

这两个都可以,但是 dynamic

dynamic arr = new int[5];
int first1 = arr.First(); // BOOM!
int first2 = Enumerable.First(arr); // plain syntax, OK

如果您知道 dynamic 对象的工作原理,这是合乎逻辑的。 dynamic variable/field/... 只是一个 object variable/field/... (加上一个属性),C# 编译器知道应该将其视为 dynamic. "treating as dynamic" 是什么意思?这意味着生成的代码不是直接使用变量,而是使用反射在对象类型中搜索所需的 methods/properties/...(因此在本例中,在 int[] 类型中)。很明显,反射不能绕过所有加载的程序集来寻找可能在任何地方的扩展方法。