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#,因此扩展方法可以工作)