Verwenden von C# Generics als Methodenparameter im IronRuby -Skript
Frage
Siehe den Code unten für mein Dilema. Ich habe ein Objekt mit einer Methode, die eine Anzahl von Elementen in einem Ilist (CountChildren) zurückgibt, das einwandfrei funktioniert. Aber ein anderer, der dasselbe tut, aber ein generisches (countgenericChildren) aufzunehmen. Ich erhalte "System.nullReferencexception: Objektreferenz nicht auf eine Instanz eines Objekts" in der Zeile, die das Skript ausführt (siehe Kommentare). Die letzten 2 Behauptungen werden nicht ausgeführt.
Ich glaube, das hat etwas mit dem Übergeben von Generika als Parameter zu tun, aber mein Wissen über IronRuby ist äußerst begrenzt. Jede Hilfe wäre geschätzt. 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()
{
}
}
Lösung
Das ist ein IronSruby -Fehler. Ändern CountGenericChildren
Methode zu empfangen List
Anstatt von IList
:
public int CountGenericChildren(List<ChildObject> c)
{
return c.Count;
}