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#切换回来,所以扩展方法有效)