2014-05-08 15 views
12

Giả sử đoạn mã này:Nhận chỉ các thành viên lớp hiện qua Reflection

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Reflection; 

namespace TestFunctionality 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     // System.Reflection.Assembly.GetExecutingAssembly().Location 
     Assembly assembly = Assembly.LoadFrom("c:\\testclass.dll"); 
     AppDomain.CurrentDomain.Load(assembly.GetName()); 
     var alltypes = assembly.GetTypes(); 
     foreach (var t in alltypes) 
     { 
     Console.WriteLine(t.Name); 
     var methods = t.GetMethods(/*BindingFlags.DeclaredOnly*/); 
     foreach (var method in methods) 
     Console.WriteLine(
     "\t--> " 
     +(method.IsPublic? "public ":"") 
     + (method.IsPrivate ? "private" : "") 
     + (method.IsStatic ? "static " : "") 
     + method.ReturnType + " " + method.Name); 
     } 
     Console.ReadKey(); 
    } 
    } 
} 

tôi đang cố gắng để có được những định nghĩa của phương pháp được định nghĩa trong lớp này nhưng không từ lớp cơ sở. tức là, tôi không muốn nhận những thứ như

System.String ToString() // A method in the base class object. 

Làm cách nào để lọc chúng?

Tôi đã cố gắng vượt qua BindingFlags.DeclaredOnly nhưng lọc mọi thứ. Đây là bên trong testclass.dll:

namespace TestClass 
{ 
public class Class1 
    { 
     public static int StaticMember(int a) { return a; } 
     private void privateMember() { } 
     private static void privateStaticMember() { } 
     public void PublicMember() { } 
     public void PublicMember2(int a) { } 
     public int PublicMember(int a) { return a; } 
    } 
} 

gì bạn đề nghị?

Cảm ơn bạn.

Trả lời

20

Bạn muốn điều này:

cl.GetMethods(BindingFlags.DeclaredOnly | 
    BindingFlags.Instance | 
    BindingFlags.Public); 

mỗi sự MSDN documentation nó khẳng định rằng DeclaredOnly:

Chỉ định rằng chỉ có các thành viên tuyên bố ở cấp độ của hệ thống phân cấp các loại cung cấp cần được xem xét. Các thành viên thừa kế không được xem xét.

Bây giờ, có lẽ bạn muốn một cách rõ ràng phương pháp mà khôngpublic:

cl.GetMethods(BindingFlags.DeclaredOnly | 
    BindingFlags.Instance | 
    BindingFlags.NonPublic); 

Nếu bạn muốn cảpublic và phi public phương pháp, làm điều này:

cl.GetMethods(BindingFlags.DeclaredOnly | 
    BindingFlags.Instance | 
    BindingFlags.Public | 
    BindingFlags.NonPublic); 

Lưu ý rằng mỗi truy vấn chứa InstancePublic hoặc NonPublic, đó là bởi vì các tài liệu khẳng định như sau:

Bạn phải chỉ định Instance hoặc tĩnh cùng với Công hoặc không công bố hoặc có thành viên nào sẽ được trả lại.

+0

1 Lưu ý: Đối với các thành viên tin đây là hành vi mặc định. Bạn sẽ chỉ nhận được các thành viên được khai báo. –

+0

@SriramSakthivel, chờ đã, sẽ không 'NonPublic' cũng lấy các thành viên' protected'? Những người đó sẽ được thừa hưởng. –

+1

Tôi phải thừa nhận rằng tôi đã xem xét việc giữ lại +1 của mình để sử dụng cụm từ "Các tùy chọn là khá vô hạn". Tôi chắc chắn rằng không có nhiều hơn một triệu tùy chọn ... ;-) – Chris

1

Tôi nghĩ rằng bạn muốn DeclaredOnly cờ ràng buộc

+0

Điều này sẽ không hoạt động một mình. –

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