2011-07-09 26 views
5

http://msdn.microsoft.com/en-us/library/435f1dw2.aspxLàm thế nào để phát hiện modifer "mới" trên một trường sử dụng sự phản chiếu?

public class Base 
{ 
    public string Field; 
} 
public class Child : Base 
{ 
    public new string Field; 
} 

[TestFixture] 
public class TestClass 
{ 

    [Test] 
    public void DetectNew() 
    { 
     var fieldInfo = typeof(Child).GetField("Field"); 
     //How do I tell fieldInfo has a new modifier? 
     Debug.WriteLine(fieldInfo); 
    } 
} 

Edit: tôi biết phương pháp và tính tôi có thể kiểm tra "MethodBase.IsHideBySig". Tại sao không tồn tại một thuộc tính tương tự cho FieldInfo?

Trả lời

2

Chỉ cần đoán, nhưng tôi nghĩ bạn phải tìm kiếm (các) lớp cơ sở cho thành viên có cùng tên.

Bạn cũng có thể xem IL đã tạo cho cả hai trường để xem liệu có bất kỳ sự khác biệt nào mà bạn có thể sử dụng thông qua phản chiếu hay không.

+0

Đây là phương pháp tôi đã hy vọng tránh. – Simon

+2

Tôi đã xem xét mã nguồn của ILSpy, họ đang làm điều tương tự - đi bộ chuỗi thừa kế. Họ đang sử dụng Mono.Cecil, nhưng không có thông tin đặc biệt nào không có thông qua phản ánh. Để biết thêm thông tin, hãy xem phương thức 'AstBuilder.SetNewModifier' của ILSpy. –

+0

Chỉ cần làm thế nào tôi nghĩ ... –

1

Hiệu ứng duy nhất của new ở đây là để ngăn chặn cảnh báo trình biên dịch.

Dự đoán của tôi là không để lại dấu vết nào trong IL được tạo.

Câu hỏi truy cập: Tại sao bạn quan tâm? Chỉ tò mò hoặc bạn có một kịch bản thực tế?

+0

"mới ở đây là để ngăn chặn một cảnh báo trình biên dịch" ?? nhưng đây không phải là trường hợp của Phương pháp và Thuộc tính. Tôi có thể kiểm tra "MethodBase.IsHideBySig". Tại sao nó khác nhau đối với các trường? – Simon

+0

các trường không bao giờ có thể là ảo. –

+0

"các trường không bao giờ có thể là ảo" đúng. tuy nhiên tôi vẫn ngạc nhiên rằng tôi có thể thêm một công cụ sửa đổi vào một trường và có chính xác IL được tạo ra. – Simon

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