c# - 为什么我的程序不能确定对动态变量使用哪种扩展方法?

标签 c# dynamic extension-methods

我有一个 dynamic value我为此创建了几个扩展方法,如下所示:

public static bool IsA(this object obj, Type t)
{
    return ObjectExtensions.Methods.IsA(obj, t);
}

public static bool IsA(this string obj, Type t)
{
    return t == typeof (string);
}

上述方法的内容超出了这个问题的范围,但是方法头应该显示我有两个扩展方法:一个在object上。还有一个在 string .

实际尝试利用上述代码的代码在这里:

if (!(value.IsA(typeof(string))))
{
    //...
}

在上面的代码片段中,value可能是 string , 一个 IEnumerable 、从我的 EF 脚手架生成的模型等...它是动态的。

我的问题是当 value 的类型是一个字符串,我得到错误:

RuntimeBinderException: 'string' does not contain a definition for 'IsA'

这完全是谎言,因为当我手动转换 value 时至 string通过((string)value) , IsA突然发现方法。

如何让我的扩展工作而无需手动转换为类型? (这违背了我想要做的事情的目的(从检查某物是什么中提取所有废话))

最佳答案

动态是在运行时确定的。不幸的是,DLR 不考虑扩展方法——那些是编译时糖。

但是,您可以这样做:

IsA(value, typeof(string))

扩展方法实际上只是带有一些语法糖的常规静态方法,使您可以将它们视为该实例上的方法,即使它实际上不是。

编辑: 或者,您应该能够将动态转换为 System.Object,然后调用扩展方法,如下所示:

(值作为对象).IsA(typeof(string))

关于c# - 为什么我的程序不能确定对动态变量使用哪种扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33900296/

相关文章:

c# - 太多的扩展方法会降低性能吗?怎么运行的

c# - SqlDependency 随时间丢失订阅

c# - AppDomain 和 MarshalByRefObject 生命周期 : how to avoid RemotingException?

c# - 尝试获取在 Linq2Entities 查询中连接的字符串

javascript - 如何使用 JavaScript 创建唯一 ID?

php - 动态断言 Zend_ACL - 在 isAllowed 上创建不需要的对象

c - 将行存储到动态结构中

c# - Azure 搜索查询字符串中的文字 & 符号

swift - 有没有一种方法可以根据参数类型简化这个 'matrix of overloads',这些参数类型最终都可以由特定类型表示?

c# - 在没有显式引用的情况下调用方法的扩展方法