Domanda

Nella mia applicazione, sto tirando in elementi da un file di progetto Microsoft utilizzando MPXJ - uno degli articoli di cui ho bisogno è i predecessori.Il modo in cui sono in grado di tirare il predecessore utilizza una configurazione in funzione di MPXJ che restituisce un tipo di java.util.list - Posso salvarlo in variabile come oggetto, ma ho bisogno di trovare un modo per portare i dati aUn formato che posso usare facilmente in modo da poterlo memorizzare in un database.Di seguito è elencato la riga del codice che sto usando per tirare i predecessori dal file del progetto.

Dim predecessors = task.getPredecessors
.

Ed ecco il risultato quando si mette un tracepoint per ottenere il valore dei predecessori

[[Relation [Task id=4 uniqueID=45577 name=Standards Training - Round 2] -> [Task id=3 uniqueID=45576 name=Process Excellence Training]]]
.

Anche se potessi ottenere quanto sopra come una corda, potrei lavorare abbastanza per ottenere i dati di cui ho bisogno.L'esempio sopra è il punto in cui c'è 1 elemento nell'elenco predecessori, ma a volte ci sono più oggetti.Ecco un esempio del tracepoint quando ci sono più oggetti.

[[Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=47 uniqueID=45857 name=Organizational Assessment]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=49 uniqueID=45859 name=Document Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=56 uniqueID=45866 name=Infrastructure Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=58 uniqueID=45868 name=IT Deliverables]], [Relation [Task id=63 uniqueID=45873 name=Complete IP Binder] -> [Task id=60 uniqueID=45870 name=Organizational Deliverables]]]
.

Grazie per il tuo aiuto.

È stato utile?

Soluzione 3

è stato in grado di completare questo usando il tostring quindi a destra e lasciato per tagliare ciò di cui ho bisogno, molto più veloce - non so perché è stato cancellato prima

Altri suggerimenti

In C # 3.5+, creando un metodo di estensione per darti un enumeratore di tipo Bello e sicuro per queste liste Java è davvero facile a causa della parola chiave yield. Puoi farlo come:

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();
                }
            }
        }

}
.

Finché lo spazio dei nomi contenente questa estensione è visibile al codice, puoi semplicemente fare quanto segue per lavorare con i predecessori:

foreach (var relation in task.getPredecessors().toIEnumerable<Relation>())
{
   Task sourceTask = relation.getSourceTask();
   //etc.
}
.

Sfortunatamente per te, stai usando vb.net. Ero nella stessa barca di te, e ho finito per creare una libreria di classe C # separata che faccio riferimento nel mio progetto VB ASP.NET. In questo modo ottengo i vantaggi della sintassi C # nel trattare con gli oggetti in stile Java IKVM senza dover convertire il mio intero progetto.

Se non vuoi farlo, puoi usare online Convertitore di codice per cambiare il codice di Jon (che non utilizza alcuna funzioni C # -Only) per VB e includerlo nel tuo progetto.

La cosa principale nel tuo caso sopra, è che non è necessario lavorare con la rappresentazione delle stringhe che vedi nel debugger (questo è solo chiamando la tostring () sugli oggetti di relazione in quell'elenco). La funzione getPredecessors() restituisce un elenco di oggetti 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
.

Esistono due modi per lavorare con collezioni Java quando si utilizza un assembly .NET prodotto da IKVM.Il primo è fare le cose il modo Java e lavorare con un iteratore:

java.util.List predecessors = task.getPredecessors();
java.util.Iterator iter = predecessors.iterator();
while (iter.hasNext())
{
   Relation rel = (Relation)iter.next();
   System.Console.WriteLine(rel);
}
.

L'altro modo è aggiungere un piccolo codice "usabilità" per nascondere questo:

foreach(Relation rel in ToEnumerable(task.getPredecessors()))
{
   System.Console.WriteLine(rel);
}
.

Per fare ciò Ho creato il metodo "Toenumable":

private static EnumerableCollection ToEnumerable(Collection javaCollection)
{
   return new EnumerableCollection(javaCollection);
}
.

e la classe EnumerableCollection, che nasconde l'uso dell'iteratore:

class EnumerableCollection
{
    public EnumerableCollection(Collection collection)
    {
        m_collection = collection;
    }

    public IEnumerator GetEnumerator()
    {
        return new Enumerator(m_collection);
    }

    private Collection m_collection;
}


public struct Enumerator : IEnumerator
{
    public Enumerator(Collection collection)
    {
        m_collection = collection;
        m_iterator = m_collection.iterator();
    }

    public object Current
    {
        get
        {
            return m_iterator.next();
        }
    }

    public bool MoveNext()
    {
        return m_iterator.hasNext();
    }

    public void Reset()
    {
        m_iterator = m_collection.iterator();
    }

    private Collection m_collection;
    private Iterator m_iterator;
}
.

Un modo più interessante per farlo sarebbe quello di usare Metodi di estensione per aggiungere questa funzionalità aLe classi di collezione Java, che renderebbero il tuo codice un po 'meno ingombra.Ho intenzione di provare a spedire un assemblaggio contenente metodi di estensione utili come parte di MPXJ nella prossima versione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top