将一个数组从IronRuby传递到C#

4
我很确定这只是一个简单的修复,但我找不到它,下面是具体情况:
我有一个C#类(我们叫它Test)在一个程序集中(假设是SOTest.dll)。以下是我正在做的事情的大致内容:
private List<string> items;

public List<string> list_items()
{
    return this.items;
}

public void set_items(List<string> new_items)
{
    this.items = new_items;
}

在IronRuby解释器中,我运行:
>>> require "SOTest.dll"
true
>>> include TestNamespace
Object
>>> myClass = Test.new
TestNamespace.Test
>>> myClass.list_items()
['Apples', 'Oranges', 'Pears']
>>> myClass.set_items ['Peaches', 'Plums']
TypeError: can't convert Array into System::Collections::Generic::List(string)

无论我将参数设置为 'List< string >'、'List< object >' 还是 'string[ ]',都会出现类似的错误。请问正确的语法是什么?我无法在任何地方找到类型的映射文档(因为在某些情况下,由于 Ruby 可以做的事情太复杂了,可能很难定义)。编辑:看起来我想要做的事情不可能实现。我必须在 .NET 项目中包含 IronRuby 组件,这样输入就可以是 IronRuby 类型,以保持脚本界面更清晰。如果有人能想出一种使其按照我最初想要的方式工作的方法,我会改变接受的答案。
2个回答

3

您需要稍微不同地构建列表:

ls = System::Collections::Generic::List.of(String).new
ls.add("Peaches")
ls.add "Pulms"

这是真的吗?List<string>有一个构造函数,它接受一个IEnumerable<string>,而IronRuby数组肯定支持它。 - Daniel Earwicker
我该如何创建一个字符串数组? - Dmitriy

1

我从未使用过它,但我猜应该是这样的:

myClass.set_items(System::Collections::Generic::List(string).new ['Peaches', 'Plums'])

那就是从数组构建一个 List<string>。我对 System::Collections::Generic::List(string) 部分表示怀疑,但根据错误信息来看,这就是在 IronRuby 中给出 List<string> 的完全限定名称的方法。

出乎意料,这不起作用(TypeError:无法将数组转换为Fixnum)。我认为RubyArray继承自IEnumerable,所以我以为它会起作用。 - cgyDeveloper
听起来好像是尝试调用错误的 List<T> 构造函数重载。也许在 IronRuby 中这还没有完全实现。 - Daniel Earwicker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接