汎用インタフェースICustomerRetListとICustomerRet-QBFC
-
27-09-2019 - |
質問
当QBFC開発者が?を使用していQBFC引に複数の異なる種類のオブジェのQuickbooks:お客様は、請求書、TaxCodes。データのクエリコードのみが異なりますのRetオブジェクトさんがいるという一部機能の成分の抽出を目的とします。
典型的な安息オブジェクトのように見え
IReponseList
IResponse
RetList
Ret
IResponseListとIResponseも汎用的に十分な作業はすべてのクエリの対応す。しかしなが汎用RetList、Retのインタフェースが使用できます、可能です。今回のタイプsepecificョICustomerRetList,ISalesTaxCodeRetList。書いていこうと思い、独立したコードのどのようなリストを返します。...
あためのインターフェースRetListはRetがんができなようです。
感謝
解決
面 IQBBase
最も近いものだけます。最もQBFCら IQBase
, を含むすべてのクエリーの種類を返します。を使用 IQBBase
参考ます。純ジェネリック医薬品を作成することができる枠組みに対応のクエリ。
更新: 反復子が現在の一部として同じく利用可能ですのゾンビ図書館のためのQBFCき グラブからのgithub.
例えば、汎用の反復子を取るのRetList型および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
}
所属していません StackOverflow