在客户类的属性上使用索引器

本文关键字:索引 属性 客户 | 更新日期: 2023-09-27 18:09:11

谷歌。我找了一段时间了,似乎没有什么符合我的具体问题。

我已经创建了我自己的类与一些属性,如

public class cPerson
{
  public int? iID {get;set;}
  public string sName { get; set; }
  public bool? bGoodGuy { get; set; }
}

则创建该类的实例

cPerson myPerson = new cPerson()

和添加值

myPerson.iID=10;
myPerson.sName="John Smith";
myPerson.bGoodGuy=true;

然后如果我想显示这个人,我会输入

writeline("Persons id : " + myPerson.iID);
writeLine("Persons name : " + myPerson.sName);
writeLine("Person is good : " + myPerson.bGoodGuy);

但是我想写的是基于属性在我的类中定义的顺序所以

writeline("Persons id : " + myPerson[0]);
writeLine("Persons name : " + myPerson[1]);
writeLine("Person is good : " + myPerson[2]);

这个不行

我只是假设这是可行的某种索引器,但是我发现的样本是用于索引几个人,例如:

writeLine("Person 0's id is : " + myPerson[0].iID);
writeLine("Person 0's name is : " + myPerson[0].sName);
writeLine("Person 0's good or bad status is : " + myPerson[0].bGoodGuy);

但这不是我想要的。

如果有人(c#)够敏锐,给我一些指导,我将非常感激。

瑞典人

在客户类的属性上使用索引器

首先,这似乎是个坏主意。如果你发现自己真的需要这个,你应该仔细考虑其他的设计方案。

其次,您是否可以按声明顺序获得属性并不清楚——我强烈建议使用更明确的顺序,例如按字母顺序。

如果你真的想这样做,你可以添加一个索引器,像这样:

public object this[int index]
{
    get
    {
        // Alternative: remove the hard-coding, and fetch the properties
        // via reflection.
        switch(index)
        {
            // Note: property names changed to conform to .NET conventions
            case 0: return Id;
            case 1: return Name;
            case 2: return GoodGuy;
            default: throw new ArgumentOutOfRangeException("index");
        }
    }
}

…但就像我说的,我不会这么做。

另一种选择是使用创建IEnumerable<object>Properties属性或方法,可能通过反射。例如:

public IEnumerable<object> Properties()
{
    return typeof(Person).GetProperties()
                         .OrderBy(p => p.Name)
                         .Select(p => p.GetValue(this, null));
}

你可以使用:

Console.WriteLine("Persons id : " + myPerson.Properties().ElementAt(0));
此外,如果真的想要,您可以在任何对象上将其作为扩展方法。不过,我还是要小心,不要这样做。