2012-02-29 16 views
6

Được đưa ra: Ví dụ System.Type.Cách nhận các phương thức theo loại

Mục đích là để có được những phương pháp mới giới thiệu (tôi không biết từ bên phải) trong các loại, đó là - không được thừa kế - không ghi đè

Tôi muốn sử dụng .NET Reflection và Tôi đã thử phương pháp Type.GetMethods(). Nhưng, nó trở lại ngay cả những người thừa kế và bị ghi đè.

Tôi đã nghĩ đến việc lọc sau khi nhận tất cả các phương pháp. Và tôi đã xem xét các thuộc tính/phương thức được hiển thị bởi lớp MethodInfo. Tôi không thể tìm ra cách để có được những gì tôi muốn.

Ví dụ: Tôi có một lớp học, class A { void Foo() { } }

Khi tôi gọi typeof(A).GetMethods(), tôi nhận được Foo cùng với các phương pháp trong System.Object: Equals, ToString, GetTypeGetHashCode. Tôi muốn lọc xuống chỉ Foo.

Có ai biết cách thực hiện việc này không?

Cảm ơn.

+1

Phương pháp kế thừa và ghi đè thuộc về loại. Tại sao bạn mong đợi họ không được liệt kê? Bạn có thể giải thích những gì bạn đang cố gắng thực hiện không? – asawyer

+0

Tôi đang cố gắng tạo báo cáo cho biết rằng các phương pháp này đã được thêm vào thư viện/sản phẩm mới. Và tôi không muốn liệt kê các phương thức kế thừa/ghi đè vì yêu cầu nghiệp vụ. Chúng phải được báo cáo như là một phần của loại xác định của chúng. – pnvn

Trả lời

8

GetMethods có tình trạng quá tải cho phép bạn chỉ định BindingFlags. Ví dụ. vì vậy nếu bạn cần để có được tất cả các phương pháp tuyên bố, công khai, ví dụ bạn cần phải vượt qua các cờ tương ứng.

var declaredPublicInstanceMethods = 
    typeof(A).GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); 
+0

Cảm ơn. Điều đó làm việc cho hầu hết các phần. Các phương thức ghi đè vẫn hiển thị. – pnvn

+1

Vâng, nếu A ghi đè một phương thức mà phương thức đó là một phần của các khai báo kiểu thì tại sao nó lại không? –

0

Bạn có thể lọc các bộ sưu tập MethodInfo trả về bởi DeclaringType:

var methods = typeof(A).GetMethods().Where(mi => mi.DeclaringType== typeof(A)); 
2

Tôi hy vọng điều này là những gì bạn muốn

var methods = typeof(MyType).GetMethods(System.Reflection.BindingFlags.DeclaredOnly); 
+0

Không hoạt động. Đối với một số lý do, cờ DeclaredOnly một mình là không đủ. Dù sao cũng cảm ơn bạn. – pnvn

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