Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用C#中的索引引用类成员变量?_C#_Class_Variables_Indexing_Member - Fatal编程技术网

是否可以使用C#中的索引引用类成员变量?

是否可以使用C#中的索引引用类成员变量?,c#,class,variables,indexing,member,C#,Class,Variables,Indexing,Member,假设我有一门课是这样的: class Person { public string name; public string address; public string city; public string state; public string zip; } // Person class and SqlDataReader have been instantiated. while (reader.Read()) { p.name =

假设我有一门课是这样的:

class Person
{
    public string name;
    public string address;
    public string city;
    public string state;
    public string zip;
}
// Person class and SqlDataReader have been instantiated.

while (reader.Read())
{
    p.name = reader[0].ToString();
    p.address = reader[1].ToString();
    p.city = reader[2].ToString();
    p.state = reader[3].ToString();
    p.zip = reader[4].ToString();
}
我正在数据库上执行数据倾斜:

Select Name, Address, City, State, Zip
FROM Persons_Tbl
目前,我将数据存储在类中,如下所示:

class Person
{
    public string name;
    public string address;
    public string city;
    public string state;
    public string zip;
}
// Person class and SqlDataReader have been instantiated.

while (reader.Read())
{
    p.name = reader[0].ToString();
    p.address = reader[1].ToString();
    p.city = reader[2].ToString();
    p.state = reader[3].ToString();
    p.zip = reader[4].ToString();
}
这只是一个例子。实际上,我有更多的列要检索。我不想为每列数据倾斜写一行,而是希望通过索引使代码更小并循环。这可以使用reader对象实现,因为我可以通过索引检索列

但是,是否可以以相同的方式索引类成员变量?下面是重写的while循环,以便更好地解释我的问题:

// pseudocode!
while (reader.Read())
{
    for (int index = 0; index < 5; index++)
    {
        index of p member variables (i.e. name, address) = reader[index].ToString();   
    }
}
//伪代码!
while(reader.Read())
{
对于(int-index=0;index<5;index++)
{
p成员变量的索引(即名称、地址)=读卡器[index].ToString();
}
}
可以用这种方式操纵类成员变量吗?或者,我必须创建一个数组类型的成员变量吗?我更愿意写出Person类的每个成员变量,因为它看起来更干净,更容易阅读


事先非常感谢。

是的,你可以这样做

例如:

class Person
{
    public string name;
    public string address;
    public string city;
    public string state;
    public string zip;

    public string this[int index] { //SPECIAL PROPERTY INDEXERS
        get {
           if(index == 0)
              return name;
           else if(index == 1)
              return address;
           ...
        }
        set {
           if(index == 0)
              name = value;
           else if(index == 1)
              address = value;
           ...
        }
    }
}
您在这里使用的是在
C.
中调用的

之后,您可以像这样使用它:

Person person = new Person();
person[0] = "James Bond"; //SET NAME
person[1] = "London";     //SET ADDRESS
.....

即使考虑到这可能是解决此问题的原始方法,我也会首先考虑重新设计代码以避免此类解决方案的可能方法。

那么您将在哪里指定哪个索引映射到哪个值?这就是你的伪代码没有显示的…好吧,我想问的是,我如何才能实现你的建议?SqlData Reader类天生就可以通过索引或列名引用列。引用成员变量时,必须键入变量。我想知道是否有可能通过索引来引用类成员变量,而不是直接写出变量。这有意义吗?我没有任何建议。我是说你的“p成员变量索引”部分现在没有意义。怎么说0表示姓名,1表示地址?您需要能够在某个地方指定…谢谢。好的,这就回答了我的问题:不,没有通过索引引用成员变量的固有方法。同样,reader对象内置了这个功能——我可以指定名称或索引。对于Person类,我必须创建一个映射。或者重新设计并考虑使用数组。变量没有索引。读卡器是不同的-您已在查询中按特定顺序指定了名称。字段将根据其在源代码中的位置进行索引的想法(如果您是这么想的话)非常脆弱。谢谢!是的,这看起来很棒。我会听从你的建议,考虑重新设计代码。但这肯定是一个有价值的解决方案。再次感谢。