2012-03-26 40 views
23

Tôi có một phương thức để nhận các giá trị từ cơ sở dữ liệu.Các thông số được đặt tên với các tham số

public virtual List<TEntity> GetValues(
      int? parameter1 = null, 
      int? parameter2 = null, 
      int? parameter3 = null, 
      params Expression<Func<TEntity, object>>[] include) 
     { 
      //... 
     } 

Làm cách nào để gọi hàm này có tham số được đặt tên để không ghi tất cả các tham số trước include? Tôi muốn làm điều gì đó như thế này

var userInfo1 = Unit.UserSrvc.GetValues(include: p => p.Membership, p => p.User); 

Nhưng điều này dường như không hoạt động? Làm cách nào để sử dụng thông số được đặt tên có tham số?

+2

thấy câu hỏi này trên một chủ đề MSDN - trông giống như bạn phải đặt tên cho mỗi đối số trong danh sách params hoặc một cái gì đó? http://bit.ly/GPZvkH –

+0

Cảm ơn James. Nhân tiện, câu trả lời chưa được tìm thấy ... Tôi nghĩ rằng nó chưa được thực hiện trong .NET. –

+0

@ChuckNorris, điều này không liên quan gì đến .Net, chỉ với C#. Các ngôn ngữ khác .Net có thể xử lý các tham số 'params' và đặt tên khác nhau, vì vậy những gì bạn muốn có thể đã có thể có trong một số ngôn ngữ khác. Ngoài ra, tôi nghĩ rằng không có "chưa": điều này dường như không thay đổi trong các phiên bản tương lai của C#. – svick

Trả lời

12

tôi nghĩ cách duy nhất là một cái gì đó như:

GetValues(include: 
    new Expression<Func<TEntity, object>>[] { p => p.Membership, p => p.User }) 

Điều đó không tuyệt vời như vậy. Nó sẽ là tốt nhất nếu bạn có thể thêm vào một tình trạng quá tải cho rằng:

public List<Entity> GetValues(params Expression<Func<Entity, object>>[] include) 
{ 
    return GetValues(null, null, null, include); 
} 

Sau đó, bạn gọi phương thức của bạn giống như

GetValues(p => p.Membership, p => p.User) 
+0

Đồng ý với @svick - u có lẽ nên thêm một vài tình trạng quá tải cho các trường hợp sử dụng điển hình của bạn. – VinayC

8

Một lập luận params hoạt động giống như một mảng, hãy thử cú pháp sau:

var userInfo1 = Unit.UserSrvc.GetValues(include: new Expression<Func<TEntity, object>>[] { p => p.Membership, p => p.User }); 

(Có thể cần một số thích ứng do các tham số chung chung, nhưng tôi nghĩ rằng bạn sẽ có được các ý chính của nó)

+5

Nếu bạn làm theo cách này, không có điểm nào có từ khóa 'params' được chỉ định. Điều này không khác gì khi chỉ có một mảng đơn giản làm đối số cuối cùng. OP hỏi làm thế nào để làm điều đó với 'params'. –

+1

Cảm ơn câu trả lời, nhưng nó không phải là những gì tôi muốn chính xác ... Rob Levine là đúng, nhưng dường như không có cách nào để làm điều này với params. –

+0

Ồ, tôi hiểu rồi, tôi hiểu lầm những gì bạn cần. Viết quá tải là chỉ thay thế tôi thấy, nhưng một lần nữa, đó không phải là những gì bạn muốn ... – madd0

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