为什么我的程序无法确定在动态变量上使用哪种扩展方法?



我有一个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可以是stringIEnumerable、从我的 EF 脚手架生成的模型等......它是动态的。

我的问题是,当value类型是字符串时,我收到错误:

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

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

如何使扩展正常工作,而无需手动强制转换为类型?(这违背了我正在尝试做的事情的目的(从检查某物是什么中抽象出所有的废话((

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

但是,您可以这样做:

IsA(value, typeof(string))

扩展方法实际上

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

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

(value as object).IsA(typeof(string))

最新更新