Использование C# Generics в качестве параметров метода в сценарии Ironruby

StackOverflow https://stackoverflow.com/questions/5344181

  •  27-10-2019
  •  | 
  •  

Вопрос

Смотрите код ниже для моей дилемы. У меня есть объект с методом, который возвращает подсчет элементов в Ilist (Countchildren), который работает нормально. Но еще один, который делает то же самое, но не входит в общий (CountGenericChildren), не так. Я получаю "System.NullReferenceException: ссылка на объект не установлен на экземпляр объекта" в строке, запускающем скрипт (см. Комментарии). Последние 2 утверждения не выполняются.

Я считаю, что это как -то связано с прохождением дженериков в качестве параметров, но мои знания о железной рубии чрезвычайно ограничены. Любая помощь будет оценена. 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()
        {
        }
    }
Это было полезно?

Решение

Это ошибка Ironruby. Чтобы обезумно, изменить CountGenericChildren метод для получения List вместо IList:

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top