【问题标题】:IronRuby calling C# Extension Methods - Error - Compatibility in .NET 3.5IronRuby 调用 C# 扩展方法 - 错误 - .NET 3.5 中的兼容性
【发布时间】:2009-09-23 14:05:54
【问题描述】:

我已经编写了一个名为 HideColumns 的 DataGridView 扩展方法。

public static class Extensions
{
    public static void HideColumns(this DataGridView dataGridView, params string[] columnNames)
    {
        foreach (string str in columnNames)
        {
            if (dataGridView.Columns[str] != null)
            {
                dataGridView.Columns[str].Visible = false;
            }
        }
    }

}

我将网格作为名为 main_grid 的变量传递给 IronRuby 脚本

当我的脚本调用时 main_grid.HideColumns("FirstName","LastName") 脚本因脚本错误而爆炸 System.Windows.Forms.DataGridView:System::Windows::Forms::DataGridView 的未定义方法“HideColumns”

扩展方法在 C# 中似乎可以正常工作。什么给了?

【问题讨论】:

    标签: c# .net extension-methods ironruby


    【解决方案1】:

    FWIW,IronRuby 1.1(需要 .net 4)提供了using_clr_extensions 方法——正如发行说明中所指出的,这会激活在给定命名空间中定义的类上定义的所有扩展方法,而不管它们是在哪个程序集中定义的;将来加载的在激活的命名空间中定义扩展方法的程序集将自动出现在正确的类型上,如下所示:

    load_assembly "System.Core"
    using_clr_extensions System::Linq
    
    # ...
    
    products.
      where(lambda { |p| p.units_in_stock == 0 }).
      each { |x| puts x.product_name }
    

    发行说明还指向http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb 上的一整套示例

    【讨论】:

      【解决方案2】:

      扩展方法只是语法糖,您需要将其称为:

      Extensions.HideColumns(main_grid, "FirstName", "LastName")
      

      或者在 C# 中创建一个派生自 DataGridView 的新类并添加方法:

      public class DataGridViewExt : DataGridView  
      {
          public void HideColumns(params string[] columnNames)
          {
              foreach (string str in columnNames)
              {
                  if (this.Columns[str] != null)
                  {
                      this.Columns[str].Visible = false;
                  }
              }
          }        
      }
      

      并在表单上使用此类而不是 System.Windows.Forms 类。

      【讨论】:

      • 我可以在 3.5 中从 Ruby 端扩展 DataGridView(添加糖)吗?我该怎么办?
      • 别这么认为,最简单的方法是从 C# 中的 DataGridView 派生一个类,并将扩展方法添加为普通实例方法(将更新答案)
      • 嗯。行。我会试试的。 +1 - 我总是对使用视觉表示扩展课程有点紧张。您对 .NET 4.0 和 IronRuby 互操作了解很多吗?那我还有其他选择吗?
      • 不要认为那样会有所帮助,我认为动态的东西更多的是 C# 调用动态语言而不是相反。
      【解决方案3】:

      既然您在 JDunkeryly 的回答中提到了 cmets,那么以下是您如何从 ruby​​ 端扩展网格。只需打开类并添加一个方法(仅适用于 ruby​​ 方面)。

      class System::Windows::Forms::DataGridView
        def hide_columns(*columnNames)
          column_names.each do |cn|
            self.columns[cn].visible = false
          end
        end
      end
      

      就直接使用扩展方法的建议而言,params 关键字对 IronRuby 来说是痛苦的。您需要使用您的参数构建一个类型化数组并传递它。您不能只将 ruby​​ 字符串包装在 ruby​​ 数组中。我今天早些时候在blog post 中完成了这项工作。但如果您有更顺畅的处理方式,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        相关资源
        最近更新 更多