2011-11-10 15 views
7

Có .NET Framework thay thế cho ExpressionHelper.GetExpressionText(LambdaExpression)? Tôi cần nó trong một số dự án không thể tham chiếu System.Web.Mvc.ExpressionHelper.GetExpressionText (LambdaExpression) thay thế

Tôi hiểu rằng một trong những khả năng là viết thực hiện của riêng tôi về phương pháp GetExpressionText(LambdaExpression) nhưng tôi không muốn làm điều đó. Mục tiêu của tôi là sử dụng lại mã .NET Framework hiện có.

+0

Chính xác những gì bạn cần? Bạn có thể mô tả nó mà không tham chiếu đến phương pháp đó không? – svick

+0

Phương thức này trả về tên của thuộc tính được chỉ định trong biểu thức lambda. Nếu bạn đã quen thuộc với ASP.NET MVC thì bạn nên nhận ra điều này: 'Html.TextBoxFor (model => model.ID)'. Phương thức 'TextBoxFor' đang sử dụng ExpressionHelper để lấy tên của thuộc tính (tức là" ID ") và tạo điều khiển với tên này. Tôi cần các chức năng tương tự: từ "x => x.SomeProperty" biểu hiện tôi phải nhận được "SomeProperty" kết quả là –

+1

không có thay thế tôi biết. FluentNHibernate ví dụ thực hiện nó là của riêng, quá. – Firo

Trả lời

8

Thực hiện phương pháp mà mình là khá dễ dàng:

string GetPropertyName(LambdaExpression expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

Nếu thông qua trong lambda là không MemberExpression, nó sẽ ném một ngoại lệ (mặc dù bạn có thể muốn có một ngoại lệ mô tả nhiều hơn).

Nếu bạn muốn gọi phương thức trực tiếp như GetPropertyName(x => x.ID), bạn cần biết bằng cách nào đó loại x là gì. Một cách là một tham số kiểu:

string GetPropertyName<T>(Expression<Func<T, object>> expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

Nhưng điều này có nghĩa là bạn phải xác định nó một cách rõ ràng:

GetPropertyName<Foo>(f => f.Id) 
+0

Tôi xin lỗi, nhưng bạn đã đọc kỹ câu hỏi của tôi chưa? Như tôi đã viết "Tôi hiểu rằng một trong những khả năng là viết bài thực hiện của riêng tôi ... nhưng tôi không muốn làm điều đó". Tôi biết cách viết các kiểu phương pháp như vậy, trong trường hợp xấu nhất tôi sử dụng Google. Cho đến bây giờ @Firo đã đưa ra câu trả lời tốt nhất trong bình luận của mình –

+0

Và tại sao bạn không muốn thực hiện nó một mình? Bạn có lý do gì không? – svick

+0

Vì tôi muốn sử dụng lại chức năng hiện có. Và, tất nhiên, sự hỗ trợ của mã này sẽ không phải là vấn đề của tôi. –

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