扩展功能不适用于动态对象

Ash*_*ani 4 c# extension-methods

我有一个以ParseLong字符串命名的扩展函数.

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

工作正常:

long x = "9".ParseLong();
Run Code Online (Sandbox Code Playgroud)

但对于动态对象,例如:

dynamic x = GetValues();
x.StartValue.ToString().ParseLong();
Run Code Online (Sandbox Code Playgroud)

生成错误:

'string'不包含'ParseLong'的定义

Mar*_*ell 13

正确,扩展功能不适用于dynamic对象.这是因为动态对象在被告知要执行时ParseLong,不知道using你的C#代码中有哪些指令,所以无法猜测你想要做什么.

扩展方法是100%的编译器功能(仅限); dynamic主要是一个运行时功能(虽然编译器必须在某些地方帮助它).

但是,如果您知道类型,则可以投射:

long x = ((string)x.StartValue).ParseLong();
Run Code Online (Sandbox Code Playgroud)

(从dynamic常规C#切换回来,所以扩展方法有效)