为什么我的程序不能确定对动态变量使用哪种扩展方法?
Why can't my program determine which extension method to use on a dynamic variable?
我有一个 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'
这完全是个谎言,因为当我通过[=22=手动将value
转换为string
时,突然发现了IsA
方法。
如何让我的扩展程序工作而无需手动转换为类型? (这违背了我想要做的事情的目的(从检查某物是什么中提取所有废话))
动态是在运行时确定的。不幸的是,DLR 不考虑扩展方法——那些是编译时糖。
但是,您可以这样做:
IsA(value, typeof(string))
扩展方法实际上只是带有一些语法糖的常规静态方法,可以让您将它们视为该实例上的方法,即使它实际上不是。
编辑:
或者,您应该能够将动态转换为 System.Object
,然后调用扩展方法,如下所示:
(value as object).IsA(typeof(string))
我有一个 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'
这完全是个谎言,因为当我通过[=22=手动将value
转换为string
时,突然发现了IsA
方法。
如何让我的扩展程序工作而无需手动转换为类型? (这违背了我想要做的事情的目的(从检查某物是什么中提取所有废话))
动态是在运行时确定的。不幸的是,DLR 不考虑扩展方法——那些是编译时糖。
但是,您可以这样做:
IsA(value, typeof(string))
扩展方法实际上只是带有一些语法糖的常规静态方法,可以让您将它们视为该实例上的方法,即使它实际上不是。
编辑:
或者,您应该能够将动态转换为 System.Object
,然后调用扩展方法,如下所示:
(value as object).IsA(typeof(string))