Uso de los genéricos de C# como parámetros del método en el script de Ironruby
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()
{
}
}
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;
}