2010-11-22 3 views
0

Tous les développeurs QBFC disponibles? J'utilise QBFC pour extraire plusieurs types d'objets de Quickbooks: Clients, Articles, Factures, TaxCodes, etc. Le code de requête de données ne varie vraiment qu'une fois que vous arrivez à l'objet Ret, donc j'essaye de construire quelques fonctions pour résumé le processus.Interfaces génériques pour ICustomerRetList et ICustomerRet - QBFC

Un objet repos typique ressemble

IReponseList 
    IResponse 
     RetList 
      Ret 

IResponseList et IResponse sont à la fois suffisamment générique pour travailler sur tous les types de réponse aux requêtes. Cependant, il ne semble pas y avoir une RetList générique et une interface Ret que je peux utiliser pour l'abstraction. J'ai seulement des interfaces de type-spécifiques comme ICustomerRetList, ISalesTaxCodeRetList, etc. Je voudrais écrire le code indépendamment de ce TYPE de liste de retour c'est ...

Y at-il une interface pour RetList ou Ret que je viens ne peut pas sembler trouver?

Merci

Répondre

0

L'interface IQBBase est la chose la plus proche de ce que vous cherchez. La plupart des éléments de QBFC sont dérivés de IQBase, y compris tous les types de requête et tous les types de retour. En utilisant les références IQBBase et les génériques .NET, il est possible de créer un cadre pour traiter les résultats de la requête.

Mise à jour: l'exemple d'itérateur ci-dessous est maintenant disponible dans le cadre de la bibliothèque Zombie pour QBFC, que vous pouvez grab from github.

Par exemple, voici un iterator générique qui prend le type de RetList et le type Ret comme paramètres:

/// <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 
}