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

时间:2015-04-20 09:08:40

标签: c# .net-4.0

是否可以解决此错误:

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'  

2 个答案:

答案 0 :(得分:4)

没有。见https://stackoverflow.com/a/5311527/613130

当您使用dynamic对象时,您无法通过&#34;扩展方法语法&#34;来调用扩展方法。说清楚:

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变量/ field / ...只是一个object变量/ field / ...(加上一个属性),C#编译器知道应该将其视为dynamic。什么&#34;视为动态&#34;手段?这意味着生成的代码而不是直接使用变量,使用反射在对象类型内搜索所需的方法/属性/ ...(在这种情况下,在int[]类型内)。很明显,反射可以绕过所有加载的程序集,以查找可能在任何地方的扩展方法。

答案 1 :(得分:2)

所有由对象类派生的类。也许试试这段代码

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