Phản ánh đặc biệt là các thành viên tư nhân là sai
- Phản xạ phá vỡ loại an toàn.Bạn có thể thử gọi một phương thức không tồn tại (nữa) hoặc với các tham số sai hoặc có quá nhiều tham số hoặc không đủ ... hoặc thậm chí theo thứ tự sai (đây là yêu thích của tôi :)). Bằng cách này, loại trả về cũng có thể thay đổi.
- Phản xạ là chậm.
Sự phản ánh của các thành viên tư nhân phá vỡ nguyên tắc đóng gói và do đó phơi bày mã của bạn theo các điều sau:
- Tăng độ phức tạp của mã của bạn vì nó phải xử lý hành vi bên trong của các lớp. Những gì được ẩn nên vẫn được giấu.
- Làm cho mã của bạn dễ bị phá vỡ vì nó sẽ biên dịch nhưng sẽ không chạy nếu phương thức thay đổi tên của nó.
- Làm cho mã riêng dễ bị phá vỡ vì nếu nó là riêng tư thì nó không có ý định được gọi theo cách đó. Có lẽ phương thức riêng mong đợi một số trạng thái bên trong trước khi được gọi.
Nếu tôi phải làm điều đó thì sao?
Có những trường hợp như vậy, khi bạn phụ thuộc vào bên thứ ba hoặc bạn cần một số api không được tiếp xúc, bạn phải thực hiện một số phản ánh. Một số người cũng sử dụng nó để kiểm tra một số lớp họ sở hữu nhưng họ không muốn thay đổi giao diện để cấp quyền truy cập cho các thành viên bên trong chỉ để kiểm tra.
Nếu bạn làm điều đó, làm điều đó đúng
Để giảm thiểu vấn đề dễ phá vỡ, tốt nhất là phát hiện bất kỳ sự cố tiềm ẩn nào bằng cách thử nghiệm trong các thử nghiệm đơn vị sẽ chạy trong một bản dựng tích hợp liên tục hoặc như vậy. Tất nhiên, điều đó có nghĩa là bạn luôn sử dụng cùng một hội đồng (có chứa các thành viên riêng). Nếu bạn sử dụng tải trọng động và phản xạ, bạn thích chơi với lửa, nhưng bạn luôn có thể bắt Ngoại lệ mà cuộc gọi có thể tạo ra.
- Giảm thiểu sự chậm chạp của sự phản ánh:
Trong các phiên bản gần đây của .Net Framework, CreatDelegate đánh bại bởi một yếu tố 50 mà Phương thứcInIn gọi:
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
các cuộc gọi sẽ nhanh hơn khoảng 50 lần so với MethodInfo.Invoke
sử dụng draw
như một tiêu chuẩn Func
như thế:
var res = draw(methodParams);
Kiểm tra bài đăng này của tôi để xem điểm chuẩn trên các cách gọi khác nhau