Generische Schnittstellen für ICustomerRetList und ICustomerRet - QBFC

StackOverflow https://stackoverflow.com/questions/4246358

  •  27-09-2019
  •  | 
  •  

Frage

Jeder QBFC Entwickler da draußen? Ich verwende QBFC auf mehrere verschiedene Arten von Objekten aus Quickbooks zu ziehen: Kunden, Artikel, Rechnungen, TaxCodes usw. Die Datenabfrage Code wirklich nur ändert, wenn Sie an das Ret Objekt erhalten so versuche ich, einige Funktionen zu bauen abstrakt der Prozess.

Eine typische Ruhe Objekt sieht aus wie

IReponseList
    IResponse
         RetList
             Ret

IResponseList und IResponse sind generisch genug, um die Arbeit an allen Abfrageantworttypen. Allerdings scheint es keine Gattungs RetList und Ret-Schnittstelle zu sein, dass ich für die Abstraktion verwenden kann. Ich habe nur Typ-sepecific Schnittstellen wie ICustomerRetList, ISalesTaxCodeRetList usw. Ich möchte den Code unabhängig davon, welche Art von Rückgabeliste schreiben ist es ....

Gibt es eine Schnittstelle für RetList oder Ret, dass ich einfach nicht scheinen zu finden?

Danke

War es hilfreich?

Lösung

Die Schnittstelle IQBBase ist die nächste Sache, was Sie suchen. Fast alles, was in QBFC von IQBase abgeleitet, einschließlich aller Abfragetypen und alle Rückgabetypen. Mit IQBBase Referenzen und .NET-Generika ist es möglich, einen Rahmen zu schaffen, mit Abfrageergebnissen beschäftigen.

Update: das Iterator Beispiel unten ist jetzt als Teil der Zombie-Bibliothek für QBFC, den Sie Greifer von github .

Zum Beispiel, hier ist eine generische Iterator, die RetList Art und Ret-Typen als Parameter verwendet:

/// <summary>
/// This generic class simplifies and standardizes iteration syntax
/// for QBFC lists.  Using this class we can use the foreach keyword
/// to iterate across all items in a list.
/// </summary>
/// <typeparam name="L">The type of the list, for example IBillRetList</typeparam>
/// <typeparam name="D">The type of the item, for example IBillRet</typeparam>
public class QBFCIterator<L, D>:IEnumerable<D> where L : class, IQBBase
{

    private L m_List;

    /// <summary>
    /// This constructor can be used for response list items or for sub-lists that are properties
    /// on other QBFC objects.
    /// </summary>
    /// <param name="lst">The sub-list</param>
    public QBFCIterator(IQBBase lst)
    {
        m_List = lst as L;

        if (m_List == null && lst != null)
        {
            throw new Exception("iterator type mismatch");
        }
    }

    public bool IsEmpty
    {
        get
        {
            if (m_List == null)
            {
                return true;
            }
            else
            {
                return Count == 0;
            }
        }
    }

    /// <summary>
    /// An efficient alternative to the Count() function
    /// </summary>
    public int EntityCount
    {
        get { return Count; }
    }

    public D GetFirstItem()
    {
        if (IsEmpty)
        {
            throw new Exception("Cannot retrieve item from empty list");
        }
        else
        {
            return GetAt(0);
        }
    }        

    #region Late-bound properties
    //
    // Since .NET requires that all methods invoked on a parameterized type
    // must compile based solely on interface constraints, we must use late
    // binding to access the count property and GetAt methods.  This may have 
    // an impact on performance and could conceivably cause run time errors 
    // with incorrect type parameters.
    //
    private int Count
    {
        get
        {
            if (m_List == null)
            {
                return 0;
            }
            else
            {
                Type t = m_List.GetType();

                return (int)t.InvokeMember("Count",
                    System.Reflection.BindingFlags.GetProperty, null, m_List, null);
            }
        }
    }

    private D GetAt(int idx)
    {
        Type t = m_List.GetType();

        return (D)t.InvokeMember("GetAt", 
            System.Reflection.BindingFlags.InvokeMethod, null, m_List, new Object[] { idx });
    }

    #endregion

    #region IEnumerable<D> Members

    public IEnumerator<D> GetEnumerator()
    {
        if (m_List != null)
        {
            for (int idx = 0; idx < Count; idx++)
            {
                yield return GetAt(idx);
            }
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        if (m_List != null)
        {
            for (int idx = 0; idx < Count; idx++)
            {
                yield return GetAt(idx);
            }
        }
    }

    #endregion
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top