IronRuby在.NET 3.5中调用C#扩展方法 – 错误 – 兼容性

我已经编写了一个名为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”)时,脚本会出现错误,脚本未定义方法’HideColumns’用于System.Windows.Forms.DataGridView:System :: Windows :: Forms :: DataGridView

扩展方法似乎可以从C#中正常工作。 是什么赋予了?

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上的一整套示例。

扩展方法只是合成糖,你需要将其称为:

 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类。

既然你在评论中提到了JDunkeryly的答案,那么你就是如何从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数组中。 我今天早些时候在一篇博客文章中将其删除了 。 但是,如果你有一个更顺畅的方法来处理,请告诉我。