2014-06-19 35 views
0

已經google.ing一段時間了,沒有什麼東西似乎符合我的具體問題。在客戶類別中使用索引器屬性

我創造我自己的類的一些特性,如

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#)足夠銳利,可以給我一些指導,我會非常感激。

問候

瑞典人

+0

首先我會問你爲什麼要這樣做,因爲這意味着你不能做任何類型的檢查。另外,當你稍後添加一個新的屬性時(你不可避免地會這樣做),順序可能會改變,所以'myPerson [1]'是當前的名字,但將來它可能是它們的標題。 – DavidG

+0

有這樣做的正當理由,因爲我正在努力爭取一個「適合所有人」的通用解決方案,也許我的頭腦被搞砸了,但它的工作原理和未來的工作方式會像一個魅力一樣,我選擇的解決方案在於每個類文件也是如此,所以在糾正任何索引以獲得適當的值方面沒有問題。 – user3755504

回答

1

首先,這似乎是一個普遍糟糕的主意。如果你發現自己真的需要這個,你應該仔細考慮設計方案。

其次,目前尚不清楚您可以以聲明的順序獲得的屬性 - 我會強烈考慮更明確的排序,例如按字母順序。

如果你真的要做到這一點,你可以添加一個索引是這樣的:

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"); 
     } 
    } 
} 

...但就像我說的,我不會這麼做。

另一種方法是讓Properties屬性或方法創建IEnumerable<object>,可能通過反射。例如:

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)); 

此外,如果你真的想,你能做出這樣的任何對象的擴展方法。再一次,我會保持警惕,儘管如此。

+0

打敗我吧,你太快了。如果這隻用於'string'表示,那麼簽名可以是'public string this [int index]',他可以在每個'return'語句中調用字符串。 –

+0

Mein得到了德梅爾有多快我得到了我正在尋找的答覆...我去你的解決方案公共對象這[int index] { 得到 { //替代方法:刪除硬編碼,並獲取物業 //通過反思。 switch(index) //注意:屬性名稱更改爲符合.NET約定 case 0:return Id; 案例1:返回名稱; 案例2:返回GoodGuy; 默認值:拋出新的ArgumentOutOfRangeException(「index」); } } } – user3755504

+0

@ user3755504:快?那已經快6分鐘了!我應該讓我感到羞愧;)不過,我希望你真的在考慮這是不是一個好主意...... –