2011-09-27 149 views
6

我想傳遞一個函數的類屬性(或者getter/setter,如果需要的話)引用。傳遞類屬性作爲參數

例如,我有一個有很多布爾標誌的類的數組。

class Flags 
{ 
    public bool a; 
    public bool b; 
    public bool c; 
    public string name; 

    public Flags(bool a, bool b, bool c, string name) 
    { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    this.name = name; 
    } 
} 

我可以寫一個返回標誌的所有實例爲其選定的標誌是真正的方法

public Flags[] getAllWhereAisTrue(Flags[] array) 
{ 
    List<Flags> resultList = new List<Flags>(); 
    for (int i = 0; i < array.Length; i++) 
    { 
    if (array[i].a == true) // for each Flags for which a is true 
    {      // add it to the results list 
     resultList.Add(array[i]); 
    } 
    } 
    return resultList.ToArray(); //return the results list as an array 
} 

我會怎麼用,讓我一個類的屬性作爲參數傳遞,從而爲了讓我不必爲Flags的每個布爾屬性寫一次這個方法(在這個例子中是三次,一次是a,b和c)?

我試圖避免給Flags一個布爾值的數組,以試圖讓結果代碼易於閱讀。我正在編寫一個供相對缺乏經驗的編程人員使用的庫。

謝謝

(有道歉,如果這是Passing property as parameter in method愚弄的人,我也不太知道它是同樣的問題)

+3

你可以用一個簡單的LINQ查詢替換你的整個方法。 – SLaks

+1

+1首先檢查重複的問題。 – wllmsaccnt

+0

可能重複[如何傳遞一個類的屬性作爲方法的參數?](http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-method) – nawfal

回答

7

你可以使用一個Func<Flags, bool>作爲參數:

public Flags[] getAllWhereAisTrue(Flags[] array, Func<Flags, bool> propertySelector) 
{ 
    List<Flags> resultList = new List<Flags>(); 
    for (int i = 0; i < array.Length; i++) 
    { 
     if (propertySelector(array[i])) // for each Flags for which a is true 
     {      // add it to the results list 
      resultList.Add(array[i]); 
     } 
    } 
    return resultList.ToArray(); //return the results list as an array 
} 

然後你可以使用像這樣:

var allAFlagsSet = getAllWhereAisTrue(flagsArray, x=> x.a); 

真的你不應該重塑這 - 的Linq這是否開箱即用(注意相似):

var allAFlagsSet = flagsArray.Where(x=> x.a).ToArray(); 

兩種解決方案都將需要A,B,C是公共的(真的應該是一個公共財產)

+0

編輯代碼以使屬性公開。我會嘗試你的代碼,並看看Linq。謝謝 –

0

根據語言規範,不可能將屬性作爲參數傳遞。 this stackoverflow post是在同一主題。此外,我將第二次評論SLaks:LINQ有一個方法可以做到這一點。

相關問題