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

标签 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'  

最佳答案

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

当您使用动态 对象时,您不能通过“扩展方法语法”调用扩展方法。说清楚:

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

关于c# - 在 C# 中创建动态扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29743568/

相关文章:

javascript - 在 asp.net 中回发后如何隐藏切换 div

c# - 插入、删除和更新命令不是由适配器构建的

c# - 这是一个错误吗? MissingMethodException 以 0 作为参数访问私有(private)静态方法

c# - 如何在 .NET-4 中创建命名管道?

c# - 当绑定(bind)属性强制执行某些业务规则时,绑定(bind) WPF TextBox 不会更新值

c# - 图像调整大小计算 - 发生了什么?

c# - 在 C# 中使用 Volatile.Write() 而不是 volatile

c# - 如何对通过 C# Azure 搜索 API 创建的索引设置新的 BM25Similarity 算法?

.net - SemaphoreSlim.Wait( CancellationToken ) 对OperationCancelledException 进行正确的try/finally 吗?

c# - 用于处理 HTTP GET 请求的 WCF 服务