扩展函数不适用于动态对象

Extension functions does not work for dynamic objects

我有一个名为 ParseLong 的扩展函数,用于字符串。

public static long ParseLong(this string x, long Default = 0) 
{ 
if (!string.IsNullOrEmpty(x)) 
     long.TryParse(x, out Default);
 return Default; 
}

并且工作正常:

long x = "9".ParseLong();

但是对于像这样的动态对象:

dynamic x = GetValues();
x.StartValue.ToString().ParseLong();

产生错误:

'string' does not contain a definition for 'ParseLong'

正确,扩展函数不适用于 dynamic 对象。那是因为动态对象在被告知执行 ParseLong 没有线索 你的 C# 代码中有什么 using 指令,所以无法猜测你想要什么去做。

扩展方法 100% 是编译器功能(仅); dynamic 主要是一个运行时特性(尽管编译器必须在某些地方提供帮助)。

不过,如果你知道类型,你可以直接转换:

long x = ((string)x.StartValue).ParseLong();

(从 dynamic 换回常规 C#,因此扩展方法有效)