En utilisant C # Generics comme paramètres de la méthode dans le script IronRuby

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

  •  27-10-2019
  •  | 
  •  

Question

Voir le code ci-dessous pour mon dilemne. Je un objet avec une méthode qui retourne le nombre d'éléments dans un IList (countChildren) qui fonctionne très bien. Mais un autre qui fait la même chose, mais en prenant dans un générique (CountGenericChildren) ne fonctionne pas. Je reçois « System.NullReferenceException: référence d'objet non définie à une instance d'un objet » sur la ligne exécutant le script (voir les commentaires). Les 2 derniers Affirme ne sont pas exécutées.

Je crois que cela a quelque chose à voir avec les génériques passer en tant que paramètres, mais ma connaissance de IronRuby est extrêmement limitée. Toute aide serait appréciée. C # v3.5, v1.0 IronRuby

    [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()
        {
        }
    }
Était-ce utile?

La solution

C'est un bug IronRuby. Pour contourner, changer la méthode CountGenericChildren pour recevoir List au lieu de IList:

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top