使用C#Generics作为IronRuby脚本中的方法参数

时间:2011-03-17 19:30:30

标签: c# ironruby generics

请参阅下面的代码,了解我的困境。我有一个对象,其方法返回IList(CountChildren)中的项目计数,工作正常。但另一个做同样的事情但是接受泛型(CountGenericChildren)却没有。我在运行脚本的行上得到“System.NullReferenceException:对象引用未设置为对象的实例”(请参阅​​注释)。最后2个断言未执行。

我认为这与将泛型作为参数传递有关,但我对IronRuby的了解非常有限。任何帮助,将不胜感激。 C#v3.5,IronRuby v1.0

    [Test]
    public void TestIronRubyGenerics()
    {
        string script = null;
        object val;
        ScriptRuntime _runtime;
        ScriptEngine _engine;
        ScriptScope _scope;

        _runtime = Ruby.CreateRuntime();
        _engine = _runtime.GetEngine("ruby");
        _scope = _runtime.CreateScope();

        _scope.SetVariable("parentobject", new ParentObject());


        // non-generic
        script = "parentobject.CountChildren(parentobject.Children)";
        val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
        Assert.IsTrue(val is int);
        Assert.AreEqual(2, val);

        // generic - this returns correctly
        script = "parentobject.GenericChildren";
        val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
        Assert.IsTrue(val is IList<ChildObject>);

        // generic - this does not
        script = "parentobject.CountGenericChildren(parentobject.GenericChildren)";
        val = _engine.CreateScriptSourceFromString(script, SourceCodeKind.Expression).Execute(_scope);
        Assert.IsTrue(val is bool);
        Assert.AreEqual(2, val);
        return;
    }

    internal class ParentObject
    {
        private IList<ChildObject> list;

        public ParentObject()
        {
            list = new List<ChildObject>();
            list.Add(new ChildObject());
            list.Add(new ChildObject());
        }

        public IList<ChildObject> GenericChildren
        {
            get
            {
                return list;
            }
        }

        public IList Children
        {
            get
            {
                IList myList = new System.Collections.ArrayList(list.Count);
                foreach(ChildObject o in list)
                    myList.Add(o);
                return myList;
            }
        }

        public int CountGenericChildren(IList<ChildObject> c)
        {
            return c.Count;
        }

        public int CountChildren(IList c)
        {
            return c.Count;
        }
    }

    internal class ChildObject
    {
        public ChildObject()
        {
        }
    }

1 个答案:

答案 0 :(得分:1)

这是一个IronRuby错误。要解决此问题,请将CountGenericChildren方法更改为接收List而不是IList

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}