【问题标题】:Extension functions does not work for dynamic objects [duplicate]扩展功能不适用于动态对象[重复]
【发布时间】:2016-07-01 08:56:43
【问题描述】:

我有一个名为 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' 的定义

【问题讨论】:

    标签: c# extension-methods


    【解决方案1】:

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

    扩展方法是 100% 的编译器特性(仅); dynamic 主要是一个运行时特性(尽管编译器必须在某些地方提供帮助)。

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

    long x = ((string)x.StartValue).ParseLong();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多