Có rất nhiều lý do tại sao thời gian biên dịch viên phản ánh vẫn chưa được thực hiện trong C# - nhưng hầu hết trong số họ về cơ bản đun sôi xuống opportunity cost - có rất nhiều ngôn ngữ khác tính năng và cải tiến cung cấp lợi ích hơn cho người dùng hơn. Cũng có cân nhắc rằng cú pháp infoof
có thể phức tạp, khó hiểu và cuối cùng kém hiệu quả hơn so với việc sử dụng phản chiếu dựa trên chuỗi. Nó cũng sẽ không phải là một sự thay thế hoàn toàn cho sự phản chiếu vì trong nhiều trường hợp siêu dữ liệu được thao tác không được biết đến lúc biên dịch.
Tuy nhiên, tất cả không bị mất, có một số thủ thuật mà bạn có thể sử dụng để thực hiện phản xạ an toàn hơn một chút để tận dụng khả năng của ngôn ngữ C#. Ví dụ, chúng ta có thể tận dụng các biểu thức lambda và các cây biểu thức để trích xuất thông tin MemberInfo.Một ví dụ đơn giản là:
public static class MethodExt {
static MethodInfo MemberInfo(Action d) {
return d.Method;
}
// other overloads ...
}
mà hoạt động khi bạn vượt qua trong một (không nặc danh) đại biểu hành động:
MethodInfo mi = MethodExt.MemberInfo(Object.ToString);
An thực hiện những điều trên sử dụng cây biểu thức có thể mạnh mẽ và linh hoạt hơn, nhưng cũng phức tạp hơn nhiều. Nó có thể được sử dụng để đại diện cho quyền truy cập thành viên và thuộc tính, các chỉ mục, v.v.
Vấn đề chính với tất cả các cách tiếp cận "ưa thích" này là chúng gây nhầm lẫn cho các nhà phát triển. Họ cũng không thể xử lý tất cả các trường hợp, mà thường dẫn đến một hỗn hợp không may của mã phản chiếu truyền thống và mã cây biểu hiện ưa thích. Cá nhân, trong khi các kỹ thuật như vậy là thú vị và sáng tạo, có lẽ tốt nhất là tránh nó trong mã sản xuất.
Nó có thể có thể được triển khai dễ dàng. Tôi cũng muốn một cái gì đó như thế này Lưu ý rằng một cú pháp thay thế sẽ được yêu cầu cho các phương thức, vì chúng có thể bị quá tải, vì vậy việc chỉ định tên một mình sẽ không đủ trong trường hợp đó. – cdhowie
Bạn có thể tạo một cái gì đó tương tự bằng cách sử dụng cây biểu hiện; điều này làm việc đặc biệt tốt cho các thuộc tính và các trường. –
@Bryant bạn có ví dụ hoặc liên kết không? – ja72