在客户类的属性上使用索引器
本文关键字:索引 属性 客户 | 更新日期: 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));
此外,如果真的想要,您可以在任何对象上将其作为扩展方法。不过,我还是要小心,不要这样做。