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

C# 扩展函数不适用于动态对象,c#,extension-methods,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; } 而且效果很好: long x = "9".ParseLong(); 但是,对于动态对象,例如: dynamic x = GetValue

对于字符串,我有一个名为
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”不包含“ParseLong”的定义


正确,扩展函数不适用于
动态对象。这是因为动态对象在被告知执行
ParseLong
时,不知道
使用的
指令在您的C#代码中是什么,因此无法猜测您想要做什么

扩展方法是100%的编译器特性(仅限)<代码>动态
主要是一种运行时功能(尽管编译器必须在某些地方提供帮助)

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

long x = ((string)x.StartValue).ParseLong();
(它从
dynamic
转换回常规C#,因此扩展方法可以工作)