2009-05-12 24 views
5

Hãy chịu với tôi nếu câu hỏi này không được xây dựng tốt. Không biết là một phần của vấn đề.Tự đề cập đến thuộc tính trong C#. Phản ánh? Chung? Kiểu?

Một ví dụ về những gì tôi muốn thực hiện có thể được tìm thấy trong PropertyChangedEventArgs trong WPF. Nếu bạn muốn gắn cờ mà một tài sản đã thay đổi trong WPF, bạn làm điều đó như thế này:

PropertyChanged(this, new PropertyChangedEventArgs("propertyName")); 

Bạn vượt qua một chuỗi để PropertyChangedEventArgs đó đề cập đến tên tài sản mà thay đổi.

Bạn có thể tưởng tượng rằng tôi không thực sự muốn các chuỗi được mã hóa cứng cho tên thuộc tính trên mã của tôi. Refactor-đổi tên bỏ lỡ nó, tất nhiên, mà làm cho nó không chỉ về mặt thẩm mỹ không hấp dẫn nhưng cũng dễ bị lỗi.

Tôi muốn nhiều hơn là tham chiếu đến thuộc tính đó ... bằng cách nào đó.

PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?)); 

Có vẻ như tôi có thể bọc nó theo một phương pháp ngắn cho phép tôi nói điều gì đó như trên.

private void MyPropertyChanged(??) { 
    PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??)); 
} 

... so I can say something like: 
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself* 

Cho đến giờ tôi đang vẽ trống.

+0

xem thêm http://stackoverflow.com/questions/388775/how-do-i-get-the-name-of-a-property-from-a-property-in-c-2-0 –

+0

http : //weblogs.asp.net/cazzu/archive/2006/07/06/Linq-beyond-queries_3A00_-strong_2D00_typed-reflection_2100_.aspx –

+0

có thể trùng lặp của [Nhận tên và loại phương thức sử dụng biểu thức lambda] (http://stackoverflow.com/questions/273941/get-method-name-and-type-using-lambda-expression) – nawfal

Trả lời

6

Không có cách nào trực tiếp để thực hiện việc này, thật không may; tuy nhiên, bạn có thể làm điều đó trong .NET 3.5 qua Expression. See here để biết thêm. Để sao chép ví dụ:

PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar); 

(thật đơn giản để thay đổi để trả lại tên thay vì PropertyInfo).

Tương tự như vậy, nó sẽ là khá đơn giản để viết một biến thể:

OnPropertyChanged(x=>x.Name); 

sử dụng:

OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...} 
+0

cảm ơn - thông tin chi tiết tuyệt vời –

1

Đây là một tính năng thường xuyên được yêu cầu, thường được gọi là infoof ("Thông tin về"), trong đó sẽ trả về đối tượng phản chiếu được liên kết với một thành viên, ví dụ

PropertyInfo pi = infoof(Person.Name); 

Đáng buồn thay, từ khóa động đang hấp thụ thời gian của nhóm trình biên dịch C# thay thế!

+0

Thật trùng hợp, chỉ tuần trước tôi đã viết một bài viết blog về "tại sao không có thông tin nào?" Mong đợi nó vào cuối tháng này. –

+0

Thật tuyệt, nó có nói "Bởi vì chúng tôi đang cho bạn thứ gì đó khác như một tính năng bất ngờ trong C# 4 nhưng cũng giống như vậy nhưng thậm chí còn tốt hơn bạn tưởng tượng !!"? * vượt qua các ngón tay * –

+0

Không. Nó nói "tính năng này là quá nhiều công việc vì lợi ích mà nó tạo ra". Xin lỗi đã làm thất vọng. –

1

Tôi khá tự tin không có cách nào để tránh chỉ định chuỗi - không có tính năng nào được tích hợp vào C# hoặc .NET cho phép bạn chuyển tham chiếu đến thuộc tính, theo như tôi biết và chuyển string đến API phản chiếu là đến nay sẽ là phương pháp đơn giản nhất.

Tuy nhiên, bên ngoài chuẩn .NET, bạn có thể tìm thấy giải pháp của mình trong PostSharp (Lập trình hướng Aspect cho .NET), cho phép bạn thêm mã tự động tăng sự kiện khi các thuộc tính khác nhau thay đổi, như bạn đã thể hiện trong câu hỏi của mình.

+0

API biểu thức cho phép điều này - xem xét "Xem ở đây" trong câu trả lời của tôi cho một ví dụ. –

+0

@Marc: Ừ, có vẻ như bạn nói đúng, mặc dù đó là một phương pháp vòng quanh khủng khiếp. Hơn nữa, nó có vẻ khá xấu xí với tôi (ít nhất, cú pháp là phức tạp), nhưng tôi là ai để nói ... đó có thể là những gì người hỏi thích. – Noldorin

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