Usando C # Generics come parametri di metodo nello script IronRuby
Domanda
Si veda il codice qui sotto per il mio dilemma. Ho un oggetto con un metodo che restituisce un conteggio di elementi in un IList (CountChildren), che funziona bene. Ma un altro che fa la stessa cosa, ma tenendo in un generico (CountGenericChildren) non lo fa. Ottengo "System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto" sulla linea che esegue lo script (vedi commenti). Gli ultimi 2 afferma non vengono eseguiti.
Credo che questo abbia a che fare con il passare generici come parametri, ma la mia conoscenza di IronRuby è estremamente limitata. Qualsiasi aiuto sarebbe apprezzato. 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()
{
}
}
Soluzione
Questo è un bug IronRuby. Per risolvere essa, cambiare il metodo di CountGenericChildren
di ricevere List
invece di IList
:
public int CountGenericChildren(List<ChildObject> c)
{
return c.Count;
}