2015-10-20 33 views
0

我有一個大型的代碼庫,它假定字段包含單個的T類值。不幸的是,新客戶端要求我們擁有這些字段指向List(Of T)。我可以改變字段類型,但所有舊的代碼都會中斷。使用從列表中返回項目的呼叫或列表中的第一項來實現API

在VB中我會解決這個問題是這樣的:

Private theList As List(Of T) = new List(Of T) 
Public ReadOnly Property Thing() As T 
    Get 
    Return theList(0) 
    End Get 
End Property 
Public ReadOnly Property Thing(i As Integer) As T 
    Get 
    Return theList(i) 'yes, this should throw 
    End Get 
End Property 

這依賴於VB對具有相同名稱的多個特性的能力,以及對超載參數傳遞和索引都括號。但是,C#在後面使用大括號,並且沒有與參數化屬性相對應的任何內容。相反,他們有「this []」,並且由於這個名字是私人的,所以你不能有一個「this」沒有參數,另一個有一個(這是對的,對吧?)。

但我怎麼會在C#中做到這一點?我懷疑我可以用模板做到這一點,但我看起來有點失落。我可以想象一個帶有this[]的List(Of T)子類,但是我不確定如何在其他類中實現訪問器,以便我仍然有ThingThing[i]。另外需要注意的是,這些對象通常在VBA中使用,因此需要COM可導出。

+0

我真的不清楚你在問什麼。你能否展示一些你現在有的代碼示例,以及一些你希望得到它們的例子調用或結果? – CodeCaster

+0

VB示例沒有返回單個值與返回列表,它們都返回單個值,只有一個返回第一個值,另一個返回索引值。 你不能改變現有屬性的數據類型,你將不得不添加新的屬性來公開一個集合

+0

這是正確的@MichaelBlackburn,他們都返回一個單一的項目。但是,第二個版本具有「列表感知」API。也就是說,被調用者知道有多個項目並且可以要求列表中的特定項目。在第一個例子中,被調用者不知道有一個列表,並且總是期望第一個項目。 –

回答

2

如果是getter本身,您可以添加一個方法來訪問屬性。 例如:

class Eg 
{ 
    List<T> Test { get; set; } 

    T GetTest() 
    { 
     return Test[0]; 
    } 

    T GetTest(int index) 
    { 
     return Test[index]; 
    } 
} 

你會然後訪問像這樣的屬性(如果要你能去掉吸氣):

Eg eg = new Eg(); 
T t = eg.GetTest(); 

T t = eg.GetTest(i); 
+0

這就是我正在考慮的,但是不會失去枚舉?或者也許我也包裝了? –

+0

我最終使用這個解決方案。不完美,但工作正在工作! –

1

我會建議使用FirstOrDefault來自Linq庫,因爲List [0]將在空列表中出錯並且d也意味着您不能切換到任何其他不支持索引讀取的數據類型

private List<T> items = new List<T>(); 

public T Item 
{ 
    get { return items.FirstOrDefault(); } 
} 

public List<T> Items 
{ 
    get { return items; } 
} 

但是性能不接受參數化除了在的這個屬性

形式,如果你使用這種方法,然後將工作如

public T GetData() 
{ 
    get { return items.FirstOrDrfault(); } 
} 

public T GetData(int index) 
{ 
    get { return items[index]; } 
} 
0

如果您需要你的類爲一個新的客戶端提供了功能,你可能需要改變你的設計讓它們依賴於一個接口,而不是該類的具體實現。這就是說,如果你的新客戶聽起來像是需要一個不同的類,它可能包含你的舊類的集合,而不是改變你的類來適應新的客戶。

相關問題