Uso de los genéricos de C# como parámetros del método en el script de Ironruby

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Vea el código a continuación para mi dilema. Tengo un objeto con un método que devuelve un recuento de elementos en una ilist (CountChildren) que funciona bien. Pero otro que hace lo mismo, pero tomar un genérico (countGenericChildren) no lo hace. Obtengo "System.NullReferenceException: Referencia de objeto no establecido en una instancia de un objeto" en la línea que ejecuta el script (ver comentarios). Los últimos 2 afirmaciones no se ejecutan.

Creo que esto tiene algo que ver con pasar los genéricos como parámetros, pero mi conocimiento de Ironruby es extremadamente limitado. Cualquier ayuda sería apreciada. 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()
        {
        }
    }
¿Fue útil?

Solución

Ese es un insecto de Ironruby. Para solucionarlo, cambie el CountGenericChildren Método para recibir List en vez de IList:

public int CountGenericChildren(List<ChildObject> c)
{
  return c.Count;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top