2015-10-20 31 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

如果您需要你的类为一个新的客户端提供了功能,你可能需要改变你的设计让它们依赖于一个接口,而不是该类的具体实现。这就是说,如果你的新客户听起来像是需要一个不同的类,它可能包含你的旧类的集合,而不是改变你的类来适应新的客户。

相关问题