IronRuby 调用 C# 扩展方法 - 错误 - .NET 3.5 中的兼容性
我已经从 DataGridView 编写了一个名为 HideColumns 的扩展方法。
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("名字","姓氏") 脚本因脚本错误而崩溃 System.Windows.Forms.DataGridView:System::Windows::Forms::DataGridView 的未定义方法“HideColumns”
扩展方法似乎在 C# 中工作正常。什么给?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
FWIW,IronRuby 1.1(需要 .net 4)提供了 using_clr_extensions 方法 - 正如发行说明中所述,这会激活在给定命名空间中定义的类上定义的所有扩展方法,无论它们定义的程序集如何在;将来加载的在激活的命名空间中定义扩展方法的程序集将自动出现在正确的类型上,如下所示:
发行说明还指出了 http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples .rb
FWIW, IronRuby 1.1 (needs .net 4) provides the
using_clr_extensions
method -- as noted in the release notes this activates all extension methods defined on classes defined in a given namespace, regardless of the assembly they are defined in; assemblies loaded in the future that define extension methods in the activated namespace will automatically appear on the correct types, like this:The release notes also point at a whole set of examples at http://github.com/ironruby/ironruby/blob/master/Languages/Ruby/Samples/Linq/101samples.rb
扩展方法只是语法糖,您需要将其调用为:
或者在 C# 中创建一个派生自 DataGridView 的新类并添加方法:
并在表单上使用此类而不是 System.Windows.Forms 类。
The extension method is just syntatic sugar, you will need to call it as:
alternatively create a new class in C# which derives from DataGridView and add the method:
and use this class rather than the System.Windows.Forms class on your form.
既然您在 JDunkeryly 的答案的评论中提到了这一点,那么以下是您从 ruby 端扩展网格的方法。只需打开类并添加一个方法(仅适用于 ruby 端)。
至于直接使用扩展方法的建议,params 关键字对 IronRuby 来说是痛苦的。您需要使用参数构建一个类型化数组并传递它。您不能只将 ruby 字符串包装在 ruby 数组中。我今天早些时候在 博客中完成了这一点发布。但如果您有更顺利的方法来处理这个问题,请告诉我。
Since you mentioned it in the comments to JDunkeryly's answer, here's how you'd extend the grid from the ruby side. Just open the class and add a method (only works from the ruby side).
As far as the suggestion to use the extension method directly, the params keyword is painful to IronRuby. You need to build a typed array with your arguments and pass it. You can't just wrap your ruby strings in a ruby array. I've pulled this off earlier today in a blog post. But if you have a smoother way to handle that, please let me know.