Общие интерфейсы для ICUSTOMERRETLIST и ICUSTOMERMET - QBFC

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

  •  27-09-2019
  •  | 
  •  

Вопрос

Любые разработчики QBFC там? Я использую QBFC, чтобы вытащить несколько различных типов объектов из QuickBooks: клиенты, элементы, счета, налоговые композиции и т. Д. Код запроса данных действительно зависит от того, как вы попадаете в объект RET, так что я пытаюсь создать некоторые функции для Аннотация процесс.

Типичный объект покоя выглядит

IReponseList
    IResponse
         RetList
             Ret

IressoSseList и Iresponse являются достаточно универсальными для работы по всем типам ответов запросов. Однако, похоже, не является универсальным ретлейком и ретсфертным интерфейсом, который я могу использовать для абстракции. У меня есть только тип сестечные интерфейсы, такие как ICUSTOMERRETLISTLIST, ISALESTAXCODERETLISTLISTLIST и т. Д. Я хотел бы написать код, независимый от того, какой тип обратного списка это ....

Есть ли интерфейс для ретклиста или отведать, что я просто не могу найти?

Спасибо

Это было полезно?

Решение

Интерфейс IQBBase самая близкая вещь к тому, что вы ищете. Больше всего все в QBFC происходит от IQBase, включая все типы запросов и все типы возврата. С использованием IQBBase Ссылки и дженерики .NET Можно создать рамки для решения результатов запроса.

Обновлять: Пример итератора ниже теперь доступен как часть библиотеки зомби для QBFC, которую вы можете схватить от Github.

Например, вот общий итератор, который принимает тип ретлейка и типа RET в качестве параметров:

/// <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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top