2012-02-17 29 views
9

Tôi có một lớp MyDummyClass mà tôi muốn chuyển một số thuộc tính dưới dạng biểu thức Lambda để đánh giá sau này. Vì vậy, những gì tôi có thể làm một cái gì đó nhưCách tốt nhất để chuyển danh sách tên thuộc tính như Biểu thức Lambda

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> property) 
    { 
     ... 
    } 
    ... 
} 

..và sau đó sử dụng lớp đó như , phải không?

Nhưng sau đó tôi muốn không chỉ vượt qua một thuộc tính duy nhất mà là danh sách các thuộc tính. Vì vậy, tôi muốn viết lớp học của tôi như

public class MyDummyClass<T> 
{ 
    public MyDummyClass(IEnumerable<Expression<Func<T, object>>> properties) 
    { 
     ... 
    } 
    ... 
} 

và tôi muốn như để sử dụng nó như new MyDummyClass<Person>(new[] { x=>x.Name, x=>x.Surname }) nhưng tiếc rằng không hoạt động! Thay vào đó, tôi phải viết

new MyDummyClass<Person> 
    (new Expression<Func<Person, object>>[] { x=>x.Name, x=>x.Surname}); 

Nhưng điều này hơi khó xử viết, phải không? Tất nhiên, việc sử dụng các thông số params sẽ hoạt động, nhưng đây chỉ là mẫu từ một đoạn mã phức tạp hơn, trong đó sử dụng thông số không phải là tùy chọn. Có bất kỳ ai có tùy chọn tốt hơn để thoát khỏi điều này không ??

+3

Tại sao bạn không muốn sử dụng 'params'? Đó là cách tiếp cận đơn giản nhất và nó sẽ hoạt động mà không cần chỉ định loại đại biểu. –

+0

Tôi cũng bỏ phiếu cho các thông số. Nó sẽ giữ cho cú pháp rất gọn gàng và đằng sau hậu trường nó sử dụng một mảng mà là những gì bạn muốn làm ở nơi đầu tiên! – Umair

+0

Chắc chắn, trong ví dụ đơn giản nó sẽ, nhưng tôi lấy nó ra khỏi một phức tạp hơn, nơi tôi không thể sử dụng params như có các tham số tùy chọn khác ở giữa mà do đó sẽ không hoạt động ... đáng buồn – Juri

Trả lời

3

Bạn có thể thử:

public class MyDummyClass<T> 
{ 
    public MyDummyClass(Expression<Func<T, object>> expression) 
    { 
     NewArrayExpression array = expression.Body as NewArrayExpression; 
     foreach(object obj in (IEnumerable<object>)(array.Expressions)) 
     { 
      Debug.Write(obj.ToString()); 
     } 
    } 
} 

Và sau đó bạn sẽ gọi nó là như thế này:

MyDummyClass<Person> cls = new MyDummyClass<Person>(item => new[] { item.Name, item.Surname }); 

Vấn đề là điều này sẽ không cung cấp cho bạn giá trị của thuộc tính vì không có cá thể thực tế nào được chỉ định Thực hiện lệnh ToString trên "obj" sẽ cung cấp cho bạn tên của thuộc tính. Tôi không biết đây có phải là thứ bạn đang theo đuổi hay không, nhưng đó có thể là điểm khởi đầu.

+0

Giải nén đường dẫn đặc tính sau đó không phải là một vấn đề, tôi đã có ... nhưng thx, cách tiếp cận của bạn có thể là một cách có thể. – Juri

+0

Tôi nghĩ rằng lợi ích chính của phương pháp này là chuyển các thuộc tính vào hàm tạo (đoạn 2) có cú pháp đơn giản, ít vụng về hơn và gần với những gì bạn đã đề cập trong bài đăng gốc của mình. – MotoSV

+0

Tôi gặp sự cố khi lớp Person có các thuộc tính với các loại khác nhau. Ví dụ, nó sẽ chứa thuộc tính Age (int). Một số trợ giúp?[Cập nhật] bằng cách sử dụng đối tượng mới [] là đúng – fravelgue

6

Hãy thử sử dụng params thay vì:

public MyDummyClass(params Expression<Func<T, object>>[] properties) 

Sau đó, bạn sẽ có thể làm:

var dummy = new DummyClass<Person>(x => x.Name, x => x.Surname); 
+0

Cảm ơn các chỉnh sửa, tôi đã viết trên tàu trên iPhone của tôi ... –

+0

Tất nhiên, tôi biết rằng nó sẽ làm việc với các thông số, tôi không thể sử dụng nó trong tình huống cụ thể của tôi. Bởi vì có một số tham số tùy chọn ở giữa và do đó nó không hoạt động ... – Juri

+0

Rất ngọt .. chỉ là những gì dr. ra lệnh !! – gcoleman0828

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