В C # 3.5+ создание метода расширения, обеспечивающего хороший перечислитель с безопасным типом для этих списков Java, действительно легко благодаря ключевому слову yield
.Вы можете сделать это следующим образом:
public static class JavaExtensions
{
public static IEnumerable<T> toIEnumerable<T>(this java.util.List list)
{
if (list != null)
{
java.util.Iterator itr = list.iterator();
while (itr.hasNext())
{
yield return (T)itr.next();
}
}
}
}
Пока пространство имен, содержащее это расширение, является видимым для вашего кода, вы можете просто сделать следующее для работы с предшественниками:
foreach (var relation in task.getPredecessors().toIEnumerable<Relation>())
{
Task sourceTask = relation.getSourceTask();
//etc.
}
К сожалению для вас, вы используете VB.Net.Я был в той же лодке, что и вы, и закончил тем, что создал отдельную библиотеку классов C #, на которую я ссылаюсь в своем проекте VB ASP.NET.Таким образом, я получаю преимущества синтаксиса C # при работе с объектами IKVM в стиле Java без необходимости конвертировать весь мой проект.
Если вы не хотите этого делать, вы можете использовать онлайнконвертер кода , чтобы изменить код Джона (который не использует только C # -функции) на VB и включить его в ваш проект.
Главное в вашем случае выше - то, что вы этого не делаетенужно работать со строковым представлением, которое вы видите в отладчике (это просто вызов toString () для объектов Relation в этом списке).Функция getPredecessors()
возвращает список объектов Relation
.
Dim predecessorList as java.util.List = task.getPredecessors()
Dim iter as java.util.Iterator = predecessorList.iterator()
Do While iter.hasNext()
Dim curRelation as Relation = iter.next()
'gets the left side of the relationship (the task you are dealing with)
Dim sourceTask as Task = curRelation.getSourceTask()
'gets the task that is the predecessor to the 'source' task
Dim targetTask as Task = curRelation.getTargetTask()
'from here you can call methods on the Task objects to get their other properties
'like name and id
Loop