68

Hành động theo câu trả lời của tôi Chọn thuộc tính mô hình bằng lambda chứ không phải câu hỏi tên thuộc tính chuỗi , muốn thêm thuộc tính vào bộ sưu tập như sau:

var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);

Tôi đã viết đoạn mã sau trong Includephương thức:

public class PropertyCollection<T>
{
    public void Include(Expression<Func<T, object>> expression)
    {
        var memberExpression = expression.Body as MemberExpression;
        if (memberExpression != null)
        {
            var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
            Properties.Add(pes.Property.Property.Name, pes.Property);
            return pes;
    }

Tuy nhiên, khi chạy mã, tôi thấy một số lambdas mang lại giá trị MemberExpression như mong đợi, nhưng một số khác mang lại giá trị UnaryExpression . Tôi đã phải thay đổi dòng mã đầu tiên thành dòng sau đây trước khi tôi có thể thêm tất cả các thuộc tính của mình bằng lambdas:

var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;

Tất cả các thuộc tính là các loại 'đơn giản', tức là chuỗi, DateTime, int, bool, v.v. trong một đối tượng kinh doanh POCO. Chúng được trang trí với một số thuộc tính DataAnnotations khác nhau .

Điều gì khiến một số lambdas trong ví dụ của tôi mang lại giá trị MemberExpressioncác giá trị UnaryExpression khác ? Trong ví dụ của tôi, UnaryExpression đầu tiên nằm trên dòng thứ ba, thuộc tính DateTime , nhưng các thuộc tính boolean cũng dẫn đến UnaryExpressions .

|
  • Có phải biểu thức UnaryExpression có thể xuất hiện trong sự hiện diện (hoặc 'không quan trọng') của các cột không thể?

    – Võ Thanh Thủy 16:00:33 25/08/2010
  • @leppie, tôi nghi ngờ nó trên các cột không thể rỗng. Trong ví dụ của tôi, UnaryExpression đầu tiên nằm trên DateTime, trong đó MemberExpression trước nằm trên chuỗi. Một UnaryExpression tiếp theo là trên một bool.

    – Trần Tú Anh 16:45:05 25/08/2010
  • Tôi sẽ điều tra một chút. Tôi đã sử dụng (hoặc đúng hơn là lạm dụng) các biểu thức như thế này trước đây và không bao giờ gặp sự cố, có nghĩa là MemberExpressionmã của tôi luôn bị lỗi. Phiên bản .NET nào bạn đang chạy? Tôi chưa sử dụng .NET 4.

    – Phan Vĩnh Phúc 21:51:16 25/08/2010
  • Không chắc chắn nếu nó sẽ có vấn đề, nhưng bạn có thể bao gồm loại biểu thức Includedự kiến ​​mong đợi không? (bao gồm các ràng buộc)

    – Phạm Thục Đoan 21:53:08 25/08/2010
  • @leppie, tôi đã thêm phương thức 'tiêu đề' với tham số biểu thức tốt nhất như tôi nhớ. Tôi không có nó với tôi.

    – Trịnh Quốc Việt 00:48:11 26/08/2010
56

Tôi nghĩ rằng tôi biết vấn đề là gì. Biểu thức của bạn trả về loại object.

Nếu bạn thay đổi kiểu này thành Expression<Func<T, R>>kiểu trả về thì nên suy ra chính xác và UnaryExpression(mà tôi sẽ cho là một số thao tác đấm bốc) sẽ không xảy ra.

Cập nhật:

Chữ ký cho Includenên là:

public void Include<T, R>(Expression<Func<T, R>> expression)
|
  • 1

    Xin lỗi sự ngu ngốc của tôi ở đây, nhưng R nên là gì? Tôi không thể biến nó thành MemberExpression, vì MemberExression nằm trong thuộc tính Body của biểu thức. Tôi đồng ý rằng UnaryExpression có lẽ là vì quyền anh.

    – Ngô Ánh Tuyết 15:46:11 26/08/2010
  • 1

    @ProfK: R chỉ đơn giản là suy ra, nó sẽ là loại tài sản được trả lại. Bạn có thể sẽ không sử dụng nó, nhưng bạn có thể :)

    – Trang Bong 15:52:27 26/08/2010
  • 1

    Tôi nghĩ rằng tôi thấy những gì đang xảy ra. Bởi vì kiểu trả về biểu thức là đối tượng, nó được đóng hộp. Với kiểu trả về đánh máy, điều này không xảy ra. Cảm ơn @leppie! Tin tưởng một người đàn ông chức năng để giúp đỡ ở đây :-)

    – Hoàng Lâm Trường 17:26:05 26/08/2010
  • 1

    Câu trả lời chính xác. Không phải chữ ký cho Bao gồm là: void void Bao gồm <R> (Biểu thức <Func <T, R >> biểu thức) vì T đã được xác định bởi lớp PropertyCollection.

    – Hoàng Bửu Chưởng 02:47:57 24/03/2011
  • 1

    @leppie Tham số loại chung T đã được xác định ở cấp lớp, do đó, nên sử dụng tên tham số loại khác nếu mục đích khác hoặc dự phòng

    – Hoàng Vĩnh Long 13:48:08 29/04/2011

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.