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

4

Let's say I have a class like this:

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

我正在对一个数据库进行数据查询:

Select Name, Address, City, State, Zip
FROM Persons_Tbl

目前,我是这样在类中存储数据的:

// 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();   
    }
}

能否以这种方式操作类成员变量?或者,必须创建一个数组类型的成员变量?我更喜欢写出Person类的每个成员变量,因为它看起来更清晰,更易于阅读。

非常感谢您提前的帮助。


2
那么你会在哪里指定哪个索引映射到哪个值呢?这是你的伪代码没有展示出来的地方... - Jon Skeet
我想问的是,我该如何实现你所提出的建议?SqlDataReader类本质上可以通过索引或列名引用列。当我引用成员变量时,必须输入变量名称。我想知道是否可能本能地通过索引引用类成员变量,而不是写出变量名称。这样说清楚了吗? - user717236
2
我并没有提出任何建议。我只是说你的“p成员变量索引”部分目前没有意义。怎么能说0表示名称,1表示地址呢?你需要在某个地方指定它... - Jon Skeet
谢谢。好的,那回答了我的问题:没有内在的方法可以通过它们的索引引用成员变量。同样,reader对象内置了这种功能——我可以指定名称或索引。对于Person类,我必须创建一个映射。或者重新设计并考虑使用数组。 - user717236
1
变量没有索引。读者是不同的 - 你在查询中指定了特定顺序的名称。如果你认为字段将按其在源代码中的位置进行索引,那么这个想法真的很脆弱。 - Jon Skeet
@Jon Skeet:你说得完全正确! - Ken Kin
1个回答

6

是的,你可以做这样的事情。

例子:

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
.....

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

谢谢!是的,这看起来很棒。我会听取你的建议并考虑重新架构代码。但这绝对是一个值得的解决方案。再次感谢。 - user717236

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接