了解多维索引器

时间:2015-12-17 13:17:56

标签: c# indexer

我非常精通OO C#的基本用法,但我有点难过,我不确定以下内容(大型项目的简化)是如何完成的以及如何传递参数:

Class test1
{
private prefr iniread;

   private void checkData()
   {
      this.iniread["string1"]["string2"][0][0]
   }
}

public class prefr :
    Component,
    ISupportInitialize,
    ISettingsLoader
{
    #region Events
    public event EventHandler Loading;
    public event EventHandler Loaded;
    public event EventHandler Saving;
    public event EventHandler Saved;
    #endregion

    #region Attributes
    private string _FileName;
    private Dictionary<string, ppPrefSection> _Sections;
    private Control _SaveControl;
    private Control _FinishControl;
    #endregion

    #region Constructors
    public prefr()
    {
        _Sections = new Dictionary<string, prefrSection>();
    }

    public prefr(IContainer container)
        : this()
    {
        container.Add(this);
    }

    public prefr(string Filename)
        : this()
    {
        if (Filename == null) throw new ArgumentNullException("Filename");
        if (!File.Exists(Tools.ReplaceFilenameMacros(Filename))) throw new ArgumentException(String.Format("Filename '{0}' not found.", Filename), "Filename");

        _FileName = Tools.ReplaceFilenameMacros(Filename);
        if (!Load())
            throw new IOException(String.Format("Error reading '{0}'.", _FileName));
    }

    public prefr(string Filename, bool createNew)
        : this()
    {
        //if (Filename == null) throw new ArgumentNullException("Filename");
        //if (!File.Exists(Tools.ReplaceFilenameMacros(Filename))) throw new ArgumentException(String.Format("Filename '{0}' not found.", Filename), "Filename");

        _FileName = Tools.ReplaceFilenameMacros(Filename);
        if (!Load(true))
            throw new IOException(String.Format("Error reading '{0}'.", _FileName));
    }

很明显我在这里缺少很多数据,但是根据我的说法,任何人都可以澄清prefr类如何在方括号内输出数据?

我错过了prefr类中的一些数据,因此可能错过了代码的重要部分。我怎样才能使用方括号中传递的信息(基本示例)?

由于

1 个答案:

答案 0 :(得分:4)

你的问题是关于如何做到这一点,对吗?

Class test1
{
    private prefr iniread;

   private void checkData()
   {
      this.iniread["string1"]["string2"][0][0]
   }
}

即。如何使用方括号调用prefr类?

这要归功于indexers。可能令人困惑的是,索引器分几个步骤使用。即不只是iniread["someName"]而是initread["string1"]["string2"][0]

但是,让我们从简单的索引器开始。这是一个简单的例子:

public class MyRegistry
{
    Dictionary<string, string> _items = new Dictionary<string,string>();

    public string this[string name]
    {
        get { return _items[name]; }
    }
}

索引器只是一个名为this的特殊属性和一个参数。因此,通过添加该属性,您可以使用

var value = theRegistry["someName"];

但是,您仍然无法在示例中使用theRegistry[0],因为您会收到编译错误。要解决这个问题,您只需要添加另一个索引器:

public class MyRegistry
{
    Dictionary<string, string> _items = new Dictionary<string,string>();

    public string this[string name]
    {
        get { return _items[name]; }
    }

    public string this[int index]
    {
        get { return _items.Values[index]; }
    }
}

现在您可以同时使用theRegistry["someName"]theRegistry[0]

但他们究竟如何才能使用theRegistry["someName"]["anotherName"]

好吧,他们返回一个也实现了索引器的对象。一个简单的例子是使用相同的对象构建层次结构:

public class MyRegistry
{
    Dictionary<string, MyRegistry> _children = new Dictionary<string,MyRegistry>();

    public MyRegistry this[string name]
    {
        get { return _items[name]; }
    }

    //notice that an object is returned instead
    public MyRegistry this[int index]
    {
        get { return _items.Values[index]; }
    }
}

这可以使用theRegistry["child1"]["child2"][0]