2011-09-27 32 views
6

Tôi muốn chuyển thuộc tính lớp (hoặc trình lấy/lấy nếu cần) tham chiếu đến một hàm.Chuyển thuộc tính lớp làm thông số

Ví dụ: tôi có một mảng của một lớp có nhiều cờ boolean.

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

tôi có thể viết một phương pháp mà trả về tất cả các trường hợp của Flags mà một lá cờ chọn đúng

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 
} 

Những gì tôi sẽ sử dụng để cho phép tôi để vượt qua một tài sản lớp như một tham số, như vậy là để cứu tôi khỏi phải viết phương thức này một lần cho mỗi thuộc tính boolean của Flags (trong ví dụ này là ba lần, một lần cho a, b và c)?

Tôi đang cố gắng tránh cho Flags một mảng Booleans trong nỗ lực giữ mã kết quả dễ đọc. Tôi đang viết một thư viện để sử dụng bởi các lập trình viên thiếu kinh nghiệm tương đối.

Cảm ơn bạn

(Với lời xin lỗi nếu điều này là một dupe của Passing property as parameter in method, tôi có thể không hoàn toàn nói nếu đó là vấn đề giống nhau)

+3

Bạn có thể thay thế toàn bộ phương thức bằng truy vấn LINQ tầm thường. – SLaks

+1

+1 về câu hỏi để kiểm tra trùng lặp trước. – wllmsaccnt

+0

có thể trùng lặp của [Làm thế nào tôi có thể vượt qua một tài sản của một lớp như một tham số của một phương pháp?] (Http://stackoverflow.com/questions/1178574/how-can-i-pass-a-property-of-a -class-as-a-parameter-of-a-method) – nawfal

Trả lời

7

Bạn có thể sử dụng một Func<Flags, bool> như tham số:

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 
} 

Sau đó, bạn có thể sử dụng nó như sau:

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

Nhưng thực sự bạn không nên tái này - LINQ thực hiện điều này ra khỏi hộp (chú ý sự tương đồng):

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

Cả hai giải pháp sẽ yêu cầu a, b, c để được công khai (thực sự phải là một tài sản công cộng trong trường hợp này)

+0

Mã đã chỉnh sửa để biến các thuộc tính thành công khai. Tôi sẽ thử mã của bạn, và nhìn vào Linq. Cám ơn –

0

theo đặc tả ngôn ngữ không thể chuyển thuộc tính làm tham số ref. this stackoverflow post có cùng chủ đề. hơn nữa, tôi sẽ lần thứ hai bình luận của SLaks: LINQ có một phương pháp chỉ thực hiện điều này.

Các vấn đề liên quan