扩展函数不适用于动态对象
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#,因此扩展方法有效)
我有一个名为 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#,因此扩展方法有效)