Смотрите код ниже для моей дилеммы.У меня есть объект с методом, который возвращает количество элементов в IList (CountChildren), который работает нормально.Но другой, который делает то же самое, но в общем (CountGenericChildren) не делает.Я получаю «System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта» в строке, в которой выполняется сценарий (см. Комментарии).Последние 2 утверждения не выполняются.
Я считаю, что это как-то связано с передачей обобщений в качестве параметров, но мои знания IronRuby крайне ограничены.Любая помощь будет оценена.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()
{
}
}