Общие интерфейсы для ICUSTOMERRETLIST и ICUSTOMERMET - QBFC
-
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
}