【问题标题】:RDLC Expression Extension MethodsRDLC 表达式扩展方法
【发布时间】:2010-07-02 23:17:46
【问题描述】:

是否可以为 RDLC 字段后面的表达式编写扩展方法?

例如,假设我的数据源中有一个 DateTime 字段,该字段可能具有有效值或可能为空。我将一个 TextBox 拖放到我的 RDLC 上,并使用 ToShortDateString() 方法格式化它的值。这适用于填充的 DateTime 值,但如果我尝试在 NULL 字段上执行 .ToShortDateString() ,这显然也会在运行时引发异常。

我想知道是否可以编写一个可以在我的 RDLC 表达式中使用的扩展方法,以便在处理 ?DateTime 值时,我可以调用像 .ConvertFromNullToEmptyString() 这样的方法。

当然还有其他方法可以解决这个问题,但我想知道在 RDLC 表达式中使用的扩展方法是否可以解决我的业务问题。

谢谢各位!

【问题讨论】:

  • +1:好问题。我相信是这样,但从来没有时间弄清楚。希望有人回答!
  • 我猜这根本不可能;太糟糕了 - 我期待着根据这里的结论性答案奖励赏金。
  • 您使用的是 ssrs,还是 asp.net 报表查看器控件。我问是因为 RDL 文件是 ssrs 报告定义语言文件,而 RDLC 是报告定义客户端语言文件,asp.net 使用它来显示报告,无 ssrs

标签: reporting-services expression rdlc ssrs-expression


【解决方案1】:

是的,这是可能的。您可以在报告中使用embed code directly 或包含custom assembly

【讨论】:

  • 这些不是使用扩展方法的例子——这就是问题所在......
  • @DanP:虽然这并没有添加扩展方法,但调用代码的方式与普通表达式相同。
【解决方案2】:

可以在对象实例上使用扩展方法,但不能使用 AS 扩展方法。您必须将它们作为对其所属类型的静态方法调用来调用。所以不是myDictionary.Values.Sum()——在字典实例的Values属性上调用Sum方法——你可以使用System.Linq.Enumerable.Sum(myDictionary.Values)——将实例传递给Enumerable类型的静态Sum方法(在此示例中,报告必须引用 System.Core 程序集)。所以是的,您可以使用也是扩展的方法,但(无论如何它似乎)不能作为特定实例的扩展。

【讨论】:

    【解决方案3】:

    虽然我同意 Corina 对该问题的解决方案,但我相信无需按照她建议的路线,使用内置表达式就可以达到更好的解决方案。在任何情况下,如果您有来自 SQL 的 DateTime,您是正确的,它可以为 null,但是,您可以使用 IIF 语句轻松测试这一点(请记住,表达式基本上在 VB 中)以检查 @ 987654322@ / nothing / empty 并且只要是东西,运行所需的操作,否则返回空白。请注意,IIF 的结果类型可能是字符串。

    【讨论】:

    • 虽然我不能为 OP 或 AMissico 发言;我个人对扩展方法特别感兴趣。如何在报告中使用任意自定义代码已经是众所周知的了——所以这些问题的答案有点毫无意义......
    • 您所问的挑战之一是反射可能被用于执行该方法,因此如果您在空对象(空日期时间)上调用 .ConvertFromNullToEmptyString(),您将无论如何都会得到一个空引用异常,除非你重写了 DateTime?对象拥有一个名为 ConvertFromNullToEmptyString 的静态方法,该方法将提供您所要求的功能。目前,我没有看到这个特定的功能比一些自定义代码更能让你受益。
    • @CodeMonkey1313 我刚刚发布了一个涵盖该问题的答案。它使用If() 三元运算符而不是IIf() 函数。
    【解决方案4】:

    例如,假设我的数据源中有一个 DateTime 字段,该字段可能具有有效值或可能为空。我将一个 TextBox 拖放到我的 RDLC 上,并使用 ToShortDateString() 方法格式化它的值。这适用于填充的 DateTime 值,但如果我尝试在 NULL 字段上执行 .ToShortDateString() ,这显然也会在运行时引发异常。

    在您的情况下应该不需要自定义函数。用VB的If() ternary operator:

    =If(Fields!MyDate.Value IsNot Nothing, Fields!MyDate.Value.ToShortDateString(), "N/A")
    

    (就我个人而言,我通过 AutoMapper 汇集我的对象,并让它用默认值或对象替换 null 值,这样我就不必处理报告中的 null 值了)。


    应该提到,If(condition, true_part, false_part) 三元运算符 应该(带有一个I)优于IIf(condition, true_part, false_part) 函数(带有两个@987654329 @'s) 在大多数情况下。

    If() 三元运算符将仅对与条件结果对应的部分进行短路评估(例如,True 的条件将仅评估 true_part)。

    IIf() 函数将始终评估条件和两个部分,因为它只是一个函数调用,函数的所有参数都将在调用之前进行评估。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      • 2010-12-20
      • 1970-01-01
      相关资源
      最近更新 更多