众所周知的解决方案是创建一个代理类:
public class MyClass
{
public class MyPropProxy
{
private MyClass c;
// ctor etc.
public string this[int index]
{
get
{
return c.list[index];
}
set
{
c.list[index] = value;
}
}
}
private List<string> list;
private MyPropProxy myPropProxy;
// ctor etc.
public MyPropProxy MyProp
{
get
{
return myPropProxy;
}
}
}
但是(除了这实际上解决了问题),这个解决方案主要只介绍了缺点:
- 它导致代码被(可能)许多小型代理类污染。
- 提出的解决方案稍微打破了封装(内部类访问外部类的私有成员),更好的解决方案是将 list 的实例传递给
MyPropProxy
ctor,这需要更多的代码。
- 我不建议公开内部助手类。可以通过引入额外的接口来解决这个问题,但这甚至是一个要实现的实体(测试、维护等)
不过,还有另一种方式。它还稍微污染了代码,但肯定比前一个少很多:
public interface IMyProp
{
string this[int index] { get; }
}
public class MyClass : IMyProp
{
private List<string> list;
string IMyProp.this[int index]
{
get
{
return list[index];
}
set
{
list[index] = value;
}
}
// ctor etc.
public IMyProp MyProp
{
get
{
return this;
}
}
}
优点:
- 没有代理类(占用内存空间,仅用于单一目的并且(在最简单的解决方案中)破坏封装。
- 简单的解决方案,只需很少的代码即可添加另一个索引属性
缺点:
- 每个属性都需要不同的公共接口
- 随着索引属性的增加,类实现的接口越来越多
这是将索引属性引入 C# 的最简单(就代码长度和复杂性而言)的方法。当然,除非有人发布更短更简单的帖子。