Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中创建动态扩展方法?_C#_.net 4.0 - Fatal编程技术网

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

在C#中创建动态扩展方法?,c#,.net-4.0,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

是否可以解决此错误:

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);
    }

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

public static bool IsDynamicNull(this object obj)
{
    return (obj == null || obj is DynamicNull);
}
不,看到了吗

当使用
动态
对象时,不能通过“扩展方法语法”调用扩展方法。为了说明这一点:

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

如果您知道
动态
对象是如何工作的,那么这是合乎逻辑的。A
动态
变量/字段/。。。只是一个
对象
变量/字段/。。。(加上一个属性),C#编译器知道该属性应被视为
动态
。“视为动态”意味着什么?这意味着生成的代码不是直接使用变量,而是使用反射来搜索所需的方法/属性/。。。在对象的类型内(在本例中,在
int[]
type内)。显然,反射不能遍历所有加载的程序集来查找可能在任何地方的扩展方法。

是。。。很酷。。。但实际上不需要执行“Hello”。IsDynamicNull()。。。或
myInt.IsDynamicNull
。。。我想限制动态变量的这种行为。。。可能是字符串,当然。。。但是声明为动态的…@Jacek不起作用。。。请参见不能在
动态对象上直接使用扩展方法(请参见)@xanatos您能否建议如何保存此问题,因为我面临RuntimeBinderException问题,我已经为对象类创建了扩展,我希望在运行时它能够找到扩展并能够执行它,但不幸的是,我得到了RuntimeBinderException,除了传递之外还有什么建议吗变量作为参数???@syedabdulkadeer您不能这样做。链接帖子中Skeet的响应足够清晰。动态和扩展方法不能很好地结合在一起。Eric Lippert的响应解释了原因。使用“this object”方法,什么不起作用:intellisense或运行时错误?@Serge当你使用动态对象时,你不能通过“扩展方法语法”调用扩展方法。这与扩展方法的类型无关。如果你有
dynamic b=something;
你不能使用任何
b.ExtensionMethod()
你说的“我不能”是什么意思我可以,我只是问会有什么结果!;@Serge你会被一个
RuntimeBinderException
扔到脸上。繁荣
dynamic arr = new int[5];
int first1 = arr.First(); // BOOM!
int first2 = Enumerable.First(arr); // plain syntax, OK