我非常精通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类中的一些数据,因此可能错过了代码的重要部分。我怎样才能使用方括号中传递的信息(基本示例)?
由于
答案 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]
。