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

时间:2016-07-01 08:56:43

标签: 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 = GetValues();
x.StartValue.ToString().ParseLong();

生成错误:

  

'串'不包含' ParseLong'

的定义

1 个答案:

答案 0 :(得分:13)

正确,扩展功能对dynamic个对象不起作用。这是因为动态对象在被告知执行ParseLong时,没有线索你的C#代码中有using个指令,所以无法猜测你想做什么。

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

但是,如果您知道类型:

,您可以投
long x = ((string)x.StartValue).ParseLong();

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